1

我正在使用以下内容在运行时生成一个方法:

System.Reflection.Assembly currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
System.CodeDom.Compiler.CompilerParameters compilerParams = new System.CodeDom.Compiler.CompilerParameters();
compilerParams.GenerateExecutable = false;
compilerParams.GenerateInMemory = true;
compilerParams.ReferencedAssemblies.Add(currentAssembly.Location);
System.CodeDom.Compiler.CodeDomProvider provider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("C#");
System.CodeDom.Compiler.CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, code);
System.Reflection.Assembly newAssembly = results.CompiledAssembly;
newAssembly.GetType("NewOut.NewClass").GetMethod("newMethod").Invoke(null, args);

它接受一个“代码”字符串,通常工作正常。然而,一些动态生成的代码显然拒绝编译,在访问 CompiledAssembly 时抛出此异常:

“无法加载文件或程序集 'file:///C:\Documents and Settings\Dan\Local Settings\Temp\tkitti7h.dll' 或其依赖项之一。系统找不到指定的文件。”

代码应该编译。

此代码确实编译,并且工作正常:

using Environment;

namespace NewOut{
public class NewClass{
    public NewClass(){
    }
    public static void newMethod(Color[,] data){
        int width = data.GetLength(0); int height = data.GetLength(1); for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ Color brighter = data[x, y].brighten(0.4f).setRed(127); data[x, y] = brighter.toward(new Color("gray", 0.5), 0.5f); } }
    }
}
}

而这个其他相同的代码,除了调用不同的 Color 构造函数之外,会引发异常:

using Environment;

namespace NewOut{
public class NewClass{
    public NewClass(){
    }
    public static void newMethod(Color[,] data){
        int width = data.GetLength(0); int height = data.GetLength(1); for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ Color brighter = data[x, y].brighten(0.4f).setRed(127); data[x, y] = brighter.toward(new Color("gray"), 0.5f); } }
    }
}
}

显然,如果我将动态生成的代码粘贴到实际的 cs 文件中,它会编译并运行良好;该单参数构造函数没有任何问题。

当然,我用谷歌搜索过,异常本身很常见,并且与缓存 dll 等有关,但我无法找出如何查看实际动态调用的编译器所抱怨的内容。我需要查看动态编译错误,因为动态生成的代码显然没有实际问题。

那么如何查看实际错误呢?

我应该注意除了 Color(string) 构造函数之外,当我尝试在动态编译的代码中使用它时,从字符串到 Color 的隐式转换也会引发 CompiledAssembly 异常。我怀疑那里有连接,特别是因为我过去注意到 C# 编译器有时会无缘无故地调用隐式字符串到颜色的转换(优化错误?)。但不管怎样,我不知道与隐式转换相关的动态编译的任何限制。

除非有人立即知道为什么我的字符串构造函数和字符串隐式转换在动态编译时失败,否则我希望有人能给我简单的指导来查看实际的动态编译器错误,因为“无法加载文件或程序集”没有帮助。

非常感谢!

4

0 回答 0