如何因为未处理的异常而停止mehtodinfo.invoke调用

时间:2013-11-19 08:34:05

标签: c# scripting msbuild

我使用sharpdevelop在我的应用程序中添加了脚本功能。我的gaol是lettign用户编写项目然后构建它并运行/调试它。在项目的输出程序集中由methodeinfo.invoke调用运行。所有这很好,我的问题是当用户脚本包含未处理的异常时。 我已经为unhandledexceptions添加了一个事件处理程序,为应用程序异常添加了另一个事件处理程序。我现在可以在用户代码抛出异常时获取自定义消息。但是当我编辑代码并尝试重建时,我有一个错误MSB 3021,因为.pdb文件被锁定。 这有什么解决方案吗? .pdb被我的应用程序锁定,因为它是由代码调用的。我可以杀死调用的线程,还是可以释放pdb文件???

3 个答案:

答案 0 :(得分:1)

PDB文件由两个代码块使用,这两个代码都是你无法控制的。调试器使用它来帮助您调试代码。对于这种特殊的事故,最重要的是,CLR在为异常生成堆栈跟踪时使用它。它是如何在跟踪中显示源代码+行号信息的。

很难看到PDB文件将被锁定多长时间,CLR使用COM接口来读取文件内容。只要异常没有被catch块捕获,锁肯定存在非零的几率。可能比这更长,不太可能。

你可以做到这一点并不是一件好事。在这种情况下,CLR在加载程序集时创建的程序集上的锁通常会遇到更大的问题。脚本运行时需要使用AppDomain来处理此问题,以便可以再次卸载脚本代码。目前尚不清楚您是否正在使用AppDomain,并且如果您解决了PDB锁定,您仍然不会遇到装配问题。

快速找到方法是不生成PDB文件,在编译脚本代码时省略/ pdb选项。如果你现在得到关于DLL的投诉,那么你有很多工作要做。

答案 1 :(得分:0)

您可以使用CancellationToken启动线程。

例如:

var cancelToken = new CancellationTokenSource();
Task.Factory.StartNew(() => yourMethod.Invoke(), cancelToken.Token);

这将停止任务:

// false indicates that no exceptions will be thrown.
cancelToken.Cancel(false);

这样,您可以在抛出异常时取消线程。

答案 2 :(得分:0)

我在这里使用委托方法解决了我的问题: Reflection MethodInfo.Invoke() catch exceptions from inside the method 这个方法我现在没有问题,未处理的异常,我的应用程序进程没有使用.pdb文件。所以我可以改变它。