代码之家  ›  专栏  ›  技术社区  ›  JDR Jake Ginnivan

C#CSharpCodeProvider:在“编译程序集”中执行方法,而不添加引用[duplicate]

  •  1
  • JDR Jake Ginnivan  · 技术社区  · 8 年前

    我试图弄清楚,在动态生成程序集时,是否可以引用以前动态生成的程序集中的类型。

    例如:

    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); 将使其正确编译,但我更喜欢直接引用内存中的程序集,而不是输出临时文件。

    0 回复  |  直到 16 年前
    推荐文章