我正在尝试弄清楚当您动态生成程序集时是否有可能引用以前动态生成的程序集中的类型。
例如:
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;
}
此代码在控制台上打印以下内容:找不到类型或命名空间名称“A”(是否缺少 using 指令或程序集引用?)
我试过很多不同的方法,但似乎没有任何效果。我错过了什么吗?这可能吗?
编辑:修复代码中的错误会提供此错误:
找不到元数据文件“l0livsmn,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”
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;
}
关于C# - 在动态生成的程序集中引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2830160/