Roslyn 动态 class 生成问题
Roslyn dynamic class generation issue
所以我正在尝试使用 Roslyn 创建一个动态类型(在运行时)。这个要求的整个背景故事太长了,无法深入探讨。但是,我确实需要创建一个具有 x 多个属性的新类型,我试图在其中输入 属性 名称和来自 Dictionary
的初始值
这里是相关代码
private void CreateAssembly(Dictionary<string, string> propertiesToEmit)
{
if (ourAssembly == null)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("using System;");
sb.AppendLine("public class MyClass");
sb.AppendLine("{");
sb.AppendLine(" public static void Main()");
sb.AppendLine(" {");
sb.AppendLine(" }");
foreach (var kvp in propertiesToEmit)
{
sb.AppendLine($" public {kvp.Value} {kvp.Key}" + " { get; set; }");
}
sb.AppendLine(" public MyClass CreateFromDynamic(Dictionary<string, object> sourceItem)");
sb.AppendLine(" {");
sb.AppendLine(" MyClass newOne = new MyClass();");
foreach (var kvp in propertiesToEmit)
{
sb.AppendLine($@" newOne.{kvp.Key} = sourceItem[""{kvp.Key}""];");
}
sb.AppendLine(" return newOne;");
sb.AppendLine(" }");
sb.AppendLine("}");
var tree = CSharpSyntaxTree.ParseText(sb.ToString());
var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var dictsLib = MetadataReference.CreateFromFile(typeof(Dictionary<,>).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { mscorlib, dictsLib });
//Emit to stream
var ms = new MemoryStream();
var emitResult = compilation.Emit(ms);
//Load into currently running assembly. Normally we'd probably
//want to do this in an AppDomain
ourAssembly = Assembly.Load(ms.ToArray());
}
}
我在使用 Roslyn 时遇到了这个奇怪的错误,它似乎找不到对 Dictionary<,> 的引用,即使它在被引用的 mscorlib 中也是如此。
可以清楚地看到,Dictionary<,>确实存在于被引用的dll(即mscorlib)中。
有什么想法吗?
好的,我找到了答案,我忘记在我使用 Roslyn 创建的代码中添加这个 using 语句
sb.AppendLine("using System.Collections.Generic;");
所以我正在尝试使用 Roslyn 创建一个动态类型(在运行时)。这个要求的整个背景故事太长了,无法深入探讨。但是,我确实需要创建一个具有 x 多个属性的新类型,我试图在其中输入 属性 名称和来自 Dictionary
的初始值这里是相关代码
private void CreateAssembly(Dictionary<string, string> propertiesToEmit)
{
if (ourAssembly == null)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("using System;");
sb.AppendLine("public class MyClass");
sb.AppendLine("{");
sb.AppendLine(" public static void Main()");
sb.AppendLine(" {");
sb.AppendLine(" }");
foreach (var kvp in propertiesToEmit)
{
sb.AppendLine($" public {kvp.Value} {kvp.Key}" + " { get; set; }");
}
sb.AppendLine(" public MyClass CreateFromDynamic(Dictionary<string, object> sourceItem)");
sb.AppendLine(" {");
sb.AppendLine(" MyClass newOne = new MyClass();");
foreach (var kvp in propertiesToEmit)
{
sb.AppendLine($@" newOne.{kvp.Key} = sourceItem[""{kvp.Key}""];");
}
sb.AppendLine(" return newOne;");
sb.AppendLine(" }");
sb.AppendLine("}");
var tree = CSharpSyntaxTree.ParseText(sb.ToString());
var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var dictsLib = MetadataReference.CreateFromFile(typeof(Dictionary<,>).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { mscorlib, dictsLib });
//Emit to stream
var ms = new MemoryStream();
var emitResult = compilation.Emit(ms);
//Load into currently running assembly. Normally we'd probably
//want to do this in an AppDomain
ourAssembly = Assembly.Load(ms.ToArray());
}
}
我在使用 Roslyn 时遇到了这个奇怪的错误,它似乎找不到对 Dictionary<,> 的引用,即使它在被引用的 mscorlib 中也是如此。
可以清楚地看到,Dictionary<,>确实存在于被引用的dll(即mscorlib)中。
有什么想法吗?
好的,我找到了答案,我忘记在我使用 Roslyn 创建的代码中添加这个 using 语句
sb.AppendLine("using System.Collections.Generic;");