CompileAssemblyFromSource生成的汇编异常中没有行号

时间:2009-05-26 17:35:21

标签: .net debugging scripting

我的应用程序有一个脚本功能,我使用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 });

3 个答案:

答案 0 :(得分:4)

我们通过将源写入临时文件然后使用该文件来编译代码而不是内存中的字符串来解决这个问题。这为我们提供了有意义的调试信息,否则我们无法获得。

答案 1 :(得分:2)

根据我发现herehere的评论,看起来程序集的PDB文件必须与附加行号之前的程序集位于同一目录中。这似乎排除了内存中程序集的调试信息。

答案 2 :(得分:0)

在为.NET Framework 4开发的应用程序中,当我运行的系统安装了.NET Framework 4.5(或者可能是以后的版本)时,我确实在异常堆栈跟踪中获得了行号,但是当它安装时我没有得到它们只有.NET Framework 4(完整或客户端配置文件)。

所以是的,现在可以从内存中的程序集中获取行号,即在.NET Framework 4.5上运行。