Как работает динамическая компиляция в .NET 8.0?

Похоже, что вы столкнулись с проблемой использования CodeDOM в .NET 8.0, так как эксепшн возникает на последней строке вашего кода. 
Можете подсказать, есть ли возможность заменить CodeDOM на другой подход для компиляции кода на лету из моего приложения?
  • 27 сентября 2024 г. 13:13
Ответы на вопрос 2
В .NET 8.0 динамическая компиляция может быть выполнена с помощью нескольких подходов, так как CodeDOM действительно утратил поддержку и может вызывать проблемы. Вместо CodeDOM вы можете использовать библиотеку Roslyn (Microsoft.CodeAnalysis) для выполнения динамической компиляции. Roslyn предоставляет мощный API для работы с кодом на C#, включая возможность компиляции кода на лету.

Вот пример, который демонстрирует, как можно использовать Roslyn для компиляции и выполнения кода на лету:

1. Убедитесь, что вы добавили необходимые пакеты NuGet в свой проект:

```bash
dotnet add package Microsoft.CodeAnalysis.CSharp
dotnet add package Microsoft.CodeAnalysis.CSharp.Scripting
dotnet add package Microsoft.CodeAnalysis.Scripting
```

2. Используйте следующий код для динамической компиляции и выполнения кода:

```csharp
using System;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;

class Program
{
    static async Task Main(string[] args)
    {
        string code = @"
            using System;

            public class ScriptedClass
            {
                public string SayHello(string name)
                {
                    return ""Hello, "" + name;
                }
            }

            var scripted = new ScriptedClass();
            scripted.SayHello(""World"");
        ";

        // Выполнение кода
        var result = await CSharpScript.EvaluateAsync<string>(code, ScriptOptions.Default);
        Console.WriteLine(result);
    }
}
```

### Пояснения:

- **CSharpScript.EvaluateAsync**: Этот метод позволяет выполнять произвольный C# код в виде строки. Вы можете использовать его для выполнения простых скриптов или более сложных фрагментов кода.
  
- **ScriptOptions**: Вы можете настраивать параметры компиляции, такие как добавление сборок или пространств имен, если это необходимо.

Если вы планируете создавать более сложные сценарии, такие как создание классов и управление их жизненным циклом, вы можете использовать `CSharpCompilation`. Это потребует больше кода, но даст вам больше контроля над процессом компиляции.

Использование Roslyn является предпочтительным решением для динамической компиляции в современных приложениях .NET и позволяет обрабатывать различные случаи, которые могут возникнуть при выполнении кода на лету.
Посмотри в сторону Microsoft.CodeAnalysis.CSharp.Scripting, но экзешник с помощью неё ты не сделаешь вроде бы 

https://weblog.west-wind.com/posts/2022/Jun/07/Run...
Похожие вопросы