日期:2014-05-20  浏览次数:20881 次

反射执行代码时无法捕获异常的问题,很怪异,请高手指教
首先说一下场景:
有三个程序集:A.exe,   B.dll,   C.dll,其中我把B.dll当作资源嵌入在A.exe中,执行时通过Assembly.Load加载后执行B.dll里面的代码,在B.dll的代码里面用到了C.dll里面的代码,由于C.dll里面的代码有可能出错,所以在B.dll里面进行了try...catch,但实际执行过程中C.dll里面产生的异常不能被B.dll里面捕获到,很怪异。
我是了下不把B.dll当作资源,而是直接在A.exe中用Assembly.LoadFrom来加载它执行,异常能被捕获到。哪位高手知道这是怎么回事?

------解决方案--------------------
try…catch的代码呢?
------解决方案--------------------
其实是因为没有添加b.dll,c.dll的引用?所以代码根本没有执行才造成的。

我有一个方法,就是直接反射成object ,然后InvokeMember执行,不要强制转换为相应的类。

------------------
如果LZ做插件的话,请参考标准的插件制作方法。
------解决方案--------------------
反射中 值类型和引用类型会有区别
------解决方案--------------------
在C.dll中你有捕获异常吗?

先捕获再抛出,这样上层才能再次捕获...

for example:

我就拿两个方法来举例:

public void InnerMethod()
{
try
{
//操作
}
catch(Exception ex)
{
//不处理,而是直接抛出
throw new Exception(ex.Message);
}
}

//另一个方法要调上面这个方法
public void OuterMethod()
{
try
{
//其他处理..
//调用
InnerMethod();
//其他..
}
catch(Exception ex)
{
//在这里对异常进行处理..
//如果InnerMethod方法中有异常,在这里也是能被捕获的..
}
}
------解决方案--------------------
顶帖
------解决方案--------------------
这种问题没遇到过,我用反射一直都正常?你确定是异常不是更严重的错误么?如果是特严重的错误可能引起系统直接崩掉,进程停止就捕不到了
------解决方案--------------------
奇怪,继续关注一下..
------解决方案--------------------

------解决方案--------------------
LZ看看有没有跟dll同名的tlb文件,没有的话导出一个tlb文件。然后再试
------解决方案--------------------
没有tlb文件,有可能是异常生成的dll。