使用CSharpCodeProvider引用项目时,无法找到元数据文件'Domain.dll'。

5

我有一个解决方案包含两个程序集,其中一个称为Domain,包含一个Book类和一个Author类。

我想动态创建一个继承自Book类的类。以下是我的代码:

public Book CreateBookProxy(Book book)
    {
      CSharpCodeProvider cscp = new CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v3.5" } });
      var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll", "Domain.dll" }, "Proxies.dll", false);
      parameters.GenerateExecutable = false;

      var compileUnit = new CodeCompileUnit();
      var ns = new CodeNamespace("Proxies");
      compileUnit.Namespaces.Add(ns);
      ns.Imports.Add(new CodeNamespaceImport("System"));
      ns.Imports.Add(new CodeNamespaceImport("Domain"));

      var classType = new CodeTypeDeclaration("BookProxy");
      classType.Attributes = MemberAttributes.Public;
      classType.BaseTypes.Add(new CodeTypeReference(typeof(Book)));
      ns.Types.Add(classType);
      var results = cscp.CompileAssemblyFromDom(parameters, compileUnit);

      List<string> errors = new List<string>();
      errors.AddRange(results.Errors.Cast<CompilerError>().Select(e => e.ErrorText));

      return Activator.CreateInstance(Type.GetType("Proxies.BookProxy, Proxies")) as Book;
    }

但是,我遇到了下面的错误:

找不到元数据文件'Domain.dll'

Domain.dll被引用在我的启动项目中,因此在运行时存在于bin目录中。

有趣的是,Assembly.Load("Domain.dll");会抛出一个FileNotFoundException。

我该如何解决这个问题呢?


它是解决方案的一部分,并且在运行时存在于bin文件夹中。 - Liath
1个回答

12

我建议明确指定 Domain.dll 的位置,如下所示:

parameters.ReferencedAssemblies.Add(typeof(<TYPE FROM DOMAIN.DLL>).Assembly.Location);

如果您还不知道要加载的类型,该怎么办? - Wilko van der Veen
@WilkovanderVeen 那么你必须知道程序集的完整路径,或者在配置文件中的 probing 元素中指定包含程序集的目录。 - Alexander Manekovskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接