动态编译后的Assembly.GetTypes()只能运行一次

时间:2014-02-21 21:37:26

标签: c# csharpcodeprovider

(我很难找到合适的标题)

我需要使用C#CodeDomProvider来编译包含每个类的几个文件。我写了一个'generator'类,其中包含所述提供程序(以及其他内容),它被调用来处理每个文件。我不能在这里通过整个代码,但相关部分将是:

    private Assembly CompileFile(string _file)
    {
        CodeDom provider = CodeDomProvider.CreateProvider("CSharp");
        CompilerParameters cparams = new CompilerParameters();
        cparams.GenerateExecutable = false;
        cparams.GenerateInMemory = true;
        cparams.ReferencedAssemblies.Add (/*assembly containing attributes classes */ assemblyReference);
        cparams.OutputAssembly =  "outputAssembly"; // Required to be able to compile more than one file with the same provider, for some reason
        CompilerResults results = provider.CompileAssemblyFromFile(_file);
        if (results.Errors.HasErrors)
        {
            StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
            foreach (CompilerError error in results.Errors )
            {
                errors.AppendFormat("Line {0},{1}\t: {2}\n", error.Line, error.Column, error.ErrorText);
            }
            throw new Exception(errors.ToString());
        }

        return results.CompiledAssembly;
    }

另一种方法:

Assembly asm = CompileFile(_file);
foreach (Type t in asm.GetTypes())
  Console.WriteLine (t.ToString ());

如果在同一个生成器类中调用此代码两次,则asm.GetTypes()将仅返回编译的第一个类型,而不返回第二个类型。 我还尝试使用相同的结果重新实例化提供程序和编译参数。 我也尝试重新实现整个生成器类,同样的问题。 编译期间不会抛出任何异常。

我可能做错什么?

0 个答案:

没有答案