我的应用程序有一个脚本功能,可以使用CodeDomProvider.CompileAssemblyFromSource从用户的脚本编译内存中的程序集。它类似于this answer中描述的内容。
它工作得很好,但是从脚本代码中抛出的任何异常在堆栈跟踪中都没有行号。我尝试设置compilerParameters.IncludeDebugInformation = true,但它仍然不包含行号。
是否可以从内存中的程序集获取异常的行号?
以下是我用来编译程序集的关键代码片段:
CompilerParameters compilerParameters =
compilerInfo.CreateDefaultCompilerParameters();
compilerParameters.GenerateInMemory = true;
compilerParameters.GenerateExecutable = false;
compilerParameters.IncludeDebugInformation = true;
...
CodeDomProvider codeProvider = compilerInfo.CreateProvider();
CompilerResults compilerResults =
codeProvider.CompileAssemblyFromSource(
compilerParameters,
new string[] { sourceCode });发布于 2009-05-26 17:39:39
我们通过将源代码写出到一个临时文件,然后使用该文件来编译代码,而不是内存中的字符串,从而解决了这个问题。这为我们提供了有意义的调试信息,否则我们无法获得。
发布于 2009-05-26 17:37:44
从我找到的here和here的注释来看,在附加行号之前,程序集的PDB文件必须与程序集位于相同的目录中。这似乎排除了内存中程序集的调试信息。
发布于 2015-07-24 20:52:52
在为.NET Framework4开发的应用程序中,当我运行的系统安装了.NET Framework4.5(或可能更高版本)时,我确实在异常堆栈跟踪中得到了行号,但当它只安装了.NET Framework4(完整版或Client Profile)时,我不会得到行号。
所以,是的,现在可以从内存中的程序集获得异常的行号,也就是通过在.NET Framework4.5上运行。
https://stackoverflow.com/questions/911840
复制相似问题