我的应用程序有一个脚本功能,我使用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 });
答案 0 :(得分:4)
我们通过将源写入临时文件然后使用该文件来编译代码而不是内存中的字符串来解决这个问题。这为我们提供了有意义的调试信息,否则我们无法获得。
答案 1 :(得分:2)
答案 2 :(得分:0)
在为.NET Framework 4开发的应用程序中,当我运行的系统安装了.NET Framework 4.5(或者可能是以后的版本)时,我确实在异常堆栈跟踪中获得了行号,但是当它安装时我没有得到它们只有.NET Framework 4(完整或客户端配置文件)。
所以是的,现在可以从内存中的程序集中获取行号,即在.NET Framework 4.5上运行。