【问题标题】:Linenumber for Exception thrown in runtime-compiled DotNET code运行时编译的 DotNET 代码中引发的异常的行号
【发布时间】:2009-10-12 02:17:06
【问题描述】:

this thread 不太一样,但非常接近。

我的程序允许人们输入一些在运行时编译、加载和执行的 VB 或 C# 代码。我的编译器参数是:

CompilerParameters params = new CompilerParameters();
params.GenerateExecutable = false;
params.GenerateInMemory = true;
params.IncludeDebugInformation = false;
params.TreatWarningsAsErrors = false;
params.WarningLevel = 4;

当此代码引发异常时,我希望能够显示一个消息框,帮助用户调试他们的代码。异常消息很简单,但行号是我卡住的地方。

我怀疑为了获得行号,我可能需要彻底更改 CompilerParameters,甚至可能需要更改这些 dll 的存储/加载方式。

有谁知道让它工作所需的最少步骤?

【问题讨论】:

    标签: c# exception stack-trace line-numbers


    【解决方案1】:

    将 OutputAssembly 设置为临时文件,设置 GenerateInMemory = false,IncludeDebugInformation = true
    这应该会生成符号并允许您使用代码行获得完整的堆栈跟踪

    【讨论】:

    • 谢谢汤姆,我担心这就是答案。现在我必须想办法在我的应用程序关闭后删除所有这些 dll 和 pdb 文件......对此有什么想法吗?
    • 只需在 Windows Temp 目录中创建它们,以便 windows 处理它:Path.GetTempFileName()
    • 那是我放它们的地方,但该文件夹在我的机器上接近 1 Gig,如果有人在照顾它,他们正在做一个马虎的工作......
    • hm,Windows 可能不会清理它,直到它“感觉”它必须清理它。您始终可以创建一个单独的文件夹并设置 OutputAssembly = "mytempfolder" + Path.GetRandomFileName() 然后在每次应用程序启动或关闭时清理它
    • 这是一个很好的解决方案。如果我的应用程序的实例仍在使用 dll,则文件删除将失败,因此我可以在运行时擦除我自己的临时文件夹中所有未使用的 dll。
    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多