我正在尝试弄清楚一个问题:当您动态生成程序集时,是否有可能引用先前动态生成的程序集中的类型。
例如:
例如:
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”
编辑2:稍微离题一点,但将GenerateInMemory更改为false,并执行parameters2.ReferencedAssemblies.Add(assem.Location);
会使其编译正确,但我非常希望引用直接在内存中的程序集而不是输出临时文件。