Работает ли динамическая компиляция кода с использованием CSharpCodeProvider (System.CodeDom) в .Net Core 2.x? - PullRequest
0 голосов
/ 22 мая 2019

В настоящее время я генерирую код, чтобы я мог сделать эквивалент динамическим прокси (без затрат на отражение при вызове методов) следующим образом:

//This is not how I'd actually use it, but shows the code generation
public string GetSomethingWrapped(object target)
{
    //Generate the code
    string code = CreateCode(target.GetType());

    CSharpCodeProvider provider = new CSharpCodeProvider();

    //We want this to be in-memory only
    CompilerParameters parameters = new CompilerParameters
    {
        GenerateExecutable = false,
        GenerateInMemory = true,
        OutputAssembly = Path.GetTempFileName()
    };

    //It needs to reference our running project's classes/namespaces
    parameters.ReferencedAssemblies.Add(typeof(MyClass).Assembly.Location);

    //Compile the code
    CompilerResults results = provider.CompileAssemblyFromSource(
        parameters,
        code
    );

    //...elided...
    IMyTestType instance = (IMyTestType) results.CompiledAssembly.CreateInstance(
        NAMESPACE + "MyTestTypeImpl",
        false,
        BindingFlags.Instance | BindingFlags.Public,
        (Binder)null,
        new object[] { myBaseObject },
        (CultureInfo)null,
        (object[])null
    );

    //Now I can call methods directly on it
    return instance.GetSomething();
}

Я провел небольшое исследование, и, похоже, это может не сработать в .Net Core 2.x, даже если я включу System.CodeDom. Есть ли другой вариант?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...