如何从动态编译的C#代码中获取错误信息

3
我有一个使用C#脚本接口的C#应用程序。这意味着我的应用程序将编译C#代码并运行它。
我使用System.CodeDom.Compiler类来完成此操作。
问题在于,如果运行下面的代码,则会抛出InvalidCastException,因为它正在尝试在我的动态代码中将字符串转换为int类型。
如果捕获异常,则无法确定错误发生在“动态代码”中的哪个位置。例如,“第8行的InvalidCastException”。
我可以获取堆栈跟踪,但没有行号。
您有什么想法吗?我想向我们的用户提供足够的信息,以了解他们的错误所在。
public class NotDynamicClass
{
    public object GetValue()
    {
        return "value";
    }
}

class Program
{
    public static void Main()
    {
        var provider = CSharpCodeProvider.CreateProvider("c#");
        var options = new CompilerParameters();
        options.ReferencedAssemblies.Add("DynamicCodingTest.exe");
        var results = provider.CompileAssemblyFromSource(options, new[] 
        { 
@"
using DynamicCodingTest;

public class DynamicClass
{
    public static void Main()
    {
        NotDynamicClass @class = new NotDynamicClass();
        int value = (int)@class.GetValue();

    }
}"
        });

        var t = results.CompiledAssembly.GetType("DynamicClass");
        t.GetMethod("Main").Invoke(null, null);
    }
}
1个回答

3
你需要在CompilerParameters上将IncludDebugInformation设置为true更新:在MSDN文档底部有一条社区备注:

对于C#,如果将此属性设置为true,则还需要将GenerateInMemory设置为false,并将OutputAssembly的值设置为有效的文件名。这将在磁盘上生成一个程序集和.pdb文件,并在编译代码中抛出任何堆栈跟踪时提供文件和行号信息。


这也是我想的,但对我来说没有任何影响。 - peter
具体来说,那会改变什么以告诉我行号?也许我只是没有看对东西。 - peter
好的,调试信息通常包含行号。另一个尝试是将 /d:DEBUG 添加到 CompilerOptions 中。 - ChrisWue
好的,太棒了。按照你上面的更新,我必须告诉它在磁盘上生成汇编代码,之后它就起作用了。 - peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接