Динамически скомпилированные плагины в .NET - PullRequest
1 голос
/ 02 апреля 2009

Есть ли вероятность, что я смогу поместить часть своего кода в некомпилированную форму с моим приложением, а затем внести изменения в него на лету, и тогда приложение сможет просто использовать новую версию?

Если это возможно (что я тайно знаю, что он использует CodeDOM), есть ли какие-либо проблемы, чтобы не использовать этот подход для подключения (кроме проблемы защиты кода)?

Есть ли пример, который я могу использовать повторно?

1 Ответ

6 голосов
/ 02 апреля 2009

Вы уже сказали, что знаете, как работать с CodeDOM - почему бы просто не использовать это?

Если вас устраивает код C #, тогда CSharpCodeProvider делает замечательную работу. Если вы чувствуете себя более предприимчивым, возможно, вы захотите Boo - прочитать книгу Айенде Рахиен о создании DSL в Boo для получения дополнительной информации и рекомендаций.

В качестве примера использования CSharpCodeProvider вы можете загрузить Snippy с моего C # на веб-сайте Depth . По сути, Snippy позволяет вам вводить фрагмент кода и запускать его, не беспокоясь об объявлении класса и т. Д. Он не делает намного больше, чем создает и запускает код, поэтому это довольно удобный пример:)

Для множества других примеров, найдите CSharpCodeProvider в переполнении стека . Вот короткий, но полный - код для "hello world" компилируется и затем выполняется.

using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;

class Test
{
    public static void Main(string[] args)
    {
        string code = @"
using System;

class CodeToBeCompiled
{
    static void Main()
    {
        Console.WriteLine(""Hello world"");
    }
}";

        var codeProvider = new CSharpCodeProvider();
        var parameters = new CompilerParameters
        {
            GenerateExecutable = true,
            OutputAssembly = "Generated.exe"
        };
        var results = codeProvider.CompileAssemblyFromSource
            (parameters, new[] { code });
        results.CompiledAssembly.EntryPoint.Invoke(null, null);
    }
}
...