有没有一种方法可以访问 class 个实例的属性,这些实例是使用 c# 中的 roslyn 编译的内存代码创建的
Is there a way to access properties from class instances created using in memory code compiled by roslyn in c#
我正在尝试创建一个简单的方法来编译一些任意 class,然后让我使用 .Net Core 3.0 和 Roslyn 编译器访问 classes 属性。
我已成功获得要编译的代码并创建了实例,但它显示为所有内容都是静态和私有的。
代码如下:
private void ExecuteOnCompileCommand()
{
var code = @"
using System;
namespace CompileTest
{
public class Test
{
public int y { get; set; }
public int x { get; set; }
}
}";
var system = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create(
"_" + Guid.NewGuid().ToString("D"),
syntaxTrees: new SyntaxTree[] { CSharpSyntaxTree.ParseText(code) },
references: new [] {system },
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
using (var ms = new MemoryStream())
{
var compilationResult = compilation.Emit(ms);
if (compilationResult.Success)
{
ms.Seek(0, SeekOrigin.Begin);
_assembly = Assembly.Load(ms.ToArray());
}
}
//create instance of class
var instance = _assembly.CreateInstance(_assembly.DefinedTypes.First().FullName);
}
编译并运行后,我在方法的末尾打了一个断点,我可以看到 x 和 y,它说它是 Test 类型,但是我无法设置这些变量,甚至无法设置他们的价值的另一个变量。
不是通常的方式,而是
如果你像这样创建它
dynamic instance = _assembly.CreateInstance(_assembly.DefinedTypes.First().FullName);
你可以这样做:
instance.x = 42;
但请记住,我们在这里放弃了强类型,任何错误都将在 运行 时抛出。
谢谢你,注意安全。
我正在尝试创建一个简单的方法来编译一些任意 class,然后让我使用 .Net Core 3.0 和 Roslyn 编译器访问 classes 属性。
我已成功获得要编译的代码并创建了实例,但它显示为所有内容都是静态和私有的。
代码如下:
private void ExecuteOnCompileCommand()
{
var code = @"
using System;
namespace CompileTest
{
public class Test
{
public int y { get; set; }
public int x { get; set; }
}
}";
var system = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create(
"_" + Guid.NewGuid().ToString("D"),
syntaxTrees: new SyntaxTree[] { CSharpSyntaxTree.ParseText(code) },
references: new [] {system },
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
using (var ms = new MemoryStream())
{
var compilationResult = compilation.Emit(ms);
if (compilationResult.Success)
{
ms.Seek(0, SeekOrigin.Begin);
_assembly = Assembly.Load(ms.ToArray());
}
}
//create instance of class
var instance = _assembly.CreateInstance(_assembly.DefinedTypes.First().FullName);
}
编译并运行后,我在方法的末尾打了一个断点,我可以看到 x 和 y,它说它是 Test 类型,但是我无法设置这些变量,甚至无法设置他们的价值的另一个变量。
不是通常的方式,而是
如果你像这样创建它
dynamic instance = _assembly.CreateInstance(_assembly.DefinedTypes.First().FullName);
你可以这样做:
instance.x = 42;
但请记住,我们在这里放弃了强类型,任何错误都将在 运行 时抛出。
谢谢你,注意安全。