Проблема Попытка программно скомпилировать код 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 '