C# – 引用动态生成的程序集中的类型

我试图弄清楚当你动态生成程序集时是否可能引用先前动态生成的程序集中的类型。

例如:

using System; using System.CodeDom.Compiler; using System.Reflection; using Microsoft.CSharp; CodeDomProvider provider = new CSharpCodeProvider(); CompilerParameters parameters = new CompilerParameters(); parameters.GenerateInMemory = true; CompilerResults results = provider.CompileAssemblyFromSource(parameters, @" namespace Dynamic { public class A { } } "); Assembly assem = results.CompiledAssembly; CodeDomProvider provider2 = new CSharpCodeProvider(); CompilerParameters parameters2 = new CompilerParameters(); parameters2.ReferencedAssemblies.Add(assem.FullName); parameters2.GenerateInMemory = true; CompilerResults results2 = provider2.CompileAssemblyFromSource(parameters2, @" namespace Dynamic { public class B : A { } } "); if (results2.Errors.HasErrors) { foreach (CompilerError error in results2.Errors) { Console.WriteLine(error.ErrorText); } } else { Assembly assem2 = results2.CompiledAssembly; } 

此代码在控制台上打印以下内容: The type or namespace name 'A' could not be found (are you missing a using directive or an assembly reference?)

我尝试了很多不同的方法,但似乎没有任何工作。 我错过了什么吗? 这有可能吗?

编辑:修复代码中的错误提供此错误: Metadata file 'l0livsmn, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' could not be found

EDIT2:侧面注释,但将GenerateInMemory更改为false,并执行parameters2.ReferencedAssemblies.Add(assem.Location); 将导致它正确编译,但我更喜欢引用直接在内存中的程序集而不是输出临时文件。

我认为

 CompilerResults results2 = provider2.CompileAssemblyFromSource(parameters, @" namespace Dynamic { public class B : A { } } "); 

您想传递parameters2 ,而不是parameters

我找到了这样做的方法,你不需要在内存中编译第一个,如果你不这样做,它将在你的临时目录中为这个程序集创建一个dll,另外,在你的调用中

 ReferencedAssemblies.Add() 

你没有传递程序集名称,你传递程序集路径,看看这段代码,它应该完美无缺:

  CodeDomProvider provider = new CSharpCodeProvider(); CompilerParameters parameters = new CompilerParameters(); CompilerResults results = provider.CompileAssemblyFromSource(parameters, @" namespace Dynamic { public class A { } } "); Assembly assem = results.CompiledAssembly; CodeDomProvider provider2 = new CSharpCodeProvider(); CompilerParameters parameters2 = new CompilerParameters(); parameters2.ReferencedAssemblies.Add(assem.Location); parameters2.GenerateInMemory = true; CompilerResults results2 = provider2.CompileAssemblyFromSource(parameters2, @" namespace Dynamic { public class B : A { } } "); if (results2.Errors.HasErrors) { foreach (CompilerError error in results2.Errors) { Console.WriteLine(error.ErrorText); } } else { Assembly assem2 = results2.CompiledAssembly; } 

MSDN说你可以:

类型引用的限制

程序集可以引用另一个程序集中定义的类型。 瞬态动态assembly可以安全地引用另一个瞬态动态assembly,可持续动态assembly或静态assembly中定义的类型。 但是,公共语言运行库不允许可持久动态模块引用瞬态动态模块中定义的类型。 这是因为在保存到磁盘后加载持久化动态模块时,运行时无法解析对瞬态动态模块中定义的类型的引用。