Невозможно скомпилировать при доступе к свойствам типа dynamici c - PullRequest
0 голосов
/ 21 апреля 2020

Проблема Попытка программно скомпилировать код c# с использованием Roslyn, но не удалось из-за следующей ошибки. 7,20): ошибка CS0656: отсутствует требуемый для компилятора элемент 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create

Используемая версия : среда выполнения: имя ОС: Ma c OS X Версия ОС: 10.15 Платформа ОС: Darwin RID: osx.10.15-x64 Базовый путь: /usr/local/share/dotnet/sdk/3.1.102/

Хост (полезно для поддержки) : Версия: 3.1.2 Фиксация: 916b5cba26

. NET Установлено Core SDK: 3.1.102 [/ usr / local / share / dotnet / sdk]

. NET Время выполнения ядра установлено: Microsoft.AspNetCore.App 3.1.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 3.1.2 [/ usr / local / share / dotnet / shared / Microsoft. NETCore.App]

Шаги для воспроизведения

 public string Compile()
    {
        string finalCode = @"public class ExpressionExecuter
                             {
                              public ExpressionExecuter(){}
                              public string FindResult(dynamic root)
                               {
                                 return root.lastName;
                               }
                              }";
        //string finalCode = new CodeTemplateManager().GetCSharpCode("return root.lastName;");

        SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(finalCode);

        var compiler = CSharpCompilation
            .Create(
                "dms.dll",
                new[] {syntaxTree},
                GetMetadataReference(),
                new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
            );

        using (var ms = new MemoryStream())
        {
            EmitResult result = compiler.Emit(ms);
            if (!result.Success)
            {
                return "false";
            }
            else
            {
                return "true";
            }
        }
    }
 public List<MetadataReference> GetMetadataReference()
    {
        var result = new List<MetadataReference>();
        result.Add(MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location));
        result.Add(MetadataReference.CreateFromFile(typeof(RuntimeBinderException).GetTypeInfo().Assembly
            .Location));
        result.Add(MetadataReference.CreateFromFile(typeof(System.Runtime.CompilerServices.DynamicAttribute)
            .GetTypeInfo().Assembly.Location));
        result.Add(MetadataReference.CreateFromFile(typeof(ExpressionType).GetTypeInfo().Assembly.Location));
        result.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("mscorlib")).Location));
        result.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Runtime")).Location));

        return result;
    }

Ожидаемое поведение : Успешная компиляция Фактическое поведение : (7 , 20): ошибка CS0656: отсутствует требуемый для компилятора член 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Дополнительная информация

Loade d Сборки

'/ usr / local / share / dotnet / shared / Microsoft.NETCore.App / 3.1.2 / System.Private.CoreLib.dll' '/ usr / local / share / dotnet /shared/Microsoft.NETCore.App/3.1.2/Microsoft.CSharp.dll '' /usr/local/share/dotnet/shared/Microsoft.NETCore.App/3.1.2/System.Linq.Expressions.dll '' /usr/local/share/dotnet/shared/Microsoft.NETCore.App/3.1.2/mscorlib.dll '' /usr/local/share/dotnet/shared/Microsoft.NETCore.App/3.1.2/System.Runtime .dll '

...