当前位置:编程学习 > C#/ASP.NET >>

¥¥¥高分求助:如何捕获调用非托管的dll的异常?这个问题好像没有找到一个真正的答案

我的WinForm程序调用了一个非托管的dll,程序运行的时候有时会莫名其妙的出现
".....错误,发生在'xxx.dll'"这样的提示,有时有的错误甚至会导致主程序死掉。
我保证我已经在所有调用这个dll内方法的所有地方都用了try... catch{}这样来捕获所有异常,
而且在Application.ThreadException也对程序所有发生的异常进行处理,还是捕获不到这个dll的异常

不知道这样的非托管调用的异常该如何处理,如何捕获啊,很着急! --------------------编程问答-------------------- 你说的对,非托管调用的异常是无法获得的

===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
=================================================== --------------------编程问答-------------------- 注明:
这个dll是Win32动态链接库,不是COM --------------------编程问答-------------------- 非托管异常在托管代码不一定会被捕获到,你还是要仔细检查你的非托管代码,跟踪一下看看怎么回事! --------------------编程问答-------------------- 非托管——字面都是这样的,就不是你程序能够管理的。你所做的就是把要求给他,

他只负责给你结果——Ok Or No Ok,呵呵~~

和二郎神一样,听调不听宣的~~

===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
=================================================== --------------------编程问答-------------------- to wzd24
问题是这个非托管的dll没有代码啊,是第一家公司提供的,问题就是得不到他的代码啊 --------------------编程问答-------------------- 使用非托管的类库,一定要慎之又慎,要考虑到各种环境下的影响,和不同版本的差异才可以。


就是因为它的不可管理型,增大了灵活度,降低了安全性

===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
=================================================== --------------------编程问答-------------------- To lovingkiss
难道就没有一个解决这样类似的问题的办法吗? --------------------编程问答-------------------- 没有代码的类库——不管是非托管还是托管,基本上你都没有办法获得错误的。

尤其它进行了自动错误屏蔽。。。。如果它的代码里面来个Try,又不给你错误提示。。。。

你想想怎么样?

===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
=================================================== --------------------编程问答-------------------- 从理论上讲,使用没有源代码的DLL——这和是否托管没有关系了。

为何很多公司强烈要求不得使用第三方控件开发的原因就在于此

——无法保证错误的有效控制。

===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
===================================================
--------------------编程问答-------------------- //这样试试

try
{
//
}
catch // 这里什么都不写
{
  //出错处理
} --------------------编程问答-------------------- 这是没有办法的,这个程序主要是负责给电信的网关收发短信,而这个dll是电信指名推荐的一家杭州公司开发的dll,他们只有Win 32的,没有.net做的组件,所以麻烦啊,我的WinForm代码应该是没有什么问题的 --------------------编程问答-------------------- to amandag(高歌) 
我程序里面和你说的是一样的

我保证我已经在所有调用这个dll内方法的所有地方都用了try... catch{}这样来捕获所有异常,
而且在Application.ThreadException也对程序所有发生的异常进行处理,还是捕获不到这个dll的异常

Application.ThreadException这个应该是最低级的了……
还是捕获不到 --------------------编程问答-------------------- haolaiwu(宁愿相信世界上有鬼,也不相信女人那张嘴) ( ) 信誉:100    Blog   加为好友  2007-06-28 08:49:26  得分: 0  
 
 
   to wzd24
问题是这个非托管的dll没有代码啊,是第一家公司提供的,问题就是得不到他的代码啊
  
----------------------------------------------------------------------------------
这个DLL是否有错误?会不会是你传入错误的参数导致DLL处理出错的??你要咨询一下这个DLL的提供商! --------------------编程问答-------------------- haolaiwu,Try只能保证你的程序出错会有提示,而不能保证外部出错也一定会进入的。

如果对方的类库没有任何错误处理——你可能会获得一定的错误提示,否则大多数你都什么都获得不了的。

--------------------编程问答-------------------- to wzd24
我是按照它提供的demo中dll的P/Invoke抄下来的,所以参数上和它提供的标准demo是一致的,我有点怀疑这个公司的开发能力了……郁闷啊
--------------------编程问答-------------------- 一般不用怀疑——确定就可以了。

不过和开发能力有些不靠边,毕竟,他开发的环境很可能和你的有所出入的,这也很正常的。 --------------------编程问答-------------------- to lovingkiss
有时候是弹出"0x77dfdffd"指令引用的"0x7c86123c"内存。该内存不能为"written"。 
这样的错误,这个肯定是这个dll内部抛出的异常啊…… --------------------编程问答-------------------- 这个不是dll内部抛出的异常,一般是它和系统冲突,系统抛出的异常;


所以我说——他开发的环境很可能和你的“环境”有所出入的;

建议:换台比较干净的系统,做一个只有一个调用该DLL的函数,用定时器刷新它,看看是否还出问题,就可以确定问题在哪里了。



不要和我抢分,半个月从光腚到星星的目标,就靠你了。。。
===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
=================================================== --------------------编程问答-------------------- haolaiwu(宁愿相信世界上有鬼,也不相信女人那张嘴) ( ) 信誉:100    Blog   加为好友  2007-06-28 08:59:29  得分: 0  
 
 
   to wzd24
我是按照它提供的demo中dll的P/Invoke抄下来的,所以参数上和它提供的标准demo是一致的,我有点怀疑这个公司的开发能力了……郁闷啊

-----------------------------------------------------------------
那你就更应该去问问他们了! --------------------编程问答-------------------- 易做图一切和我抢分的人,呵呵~~


不要和我抢分,半个月从光腚到星星的目标,就靠你了。。。
===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
=================================================== --------------------编程问答-------------------- to lovingkiss
===================================================
技术交流不该有界限 资源共享不该有条件
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
1、欢迎一切问题有关的交流——无论答案对错;
2、不欢迎 顶、Mark、支持之类口水混分的人;
3、对带有性别的主题和求全部毕业代码者尽量不回答;
我保留对非<散分贴>蹭分者的厌恶和鄙视...
精通:jīnɡtōnɡ对学问技术等透彻的了解并熟练掌握
所以,我没有精通,只有JZ
===================================================



你的这个尾巴太长了点……哈哈 --------------------编程问答-------------------- //这样试试

try
{
//
}
catch // 这里什么都不写
{
  //出错处理
}
---------------------------------------------------------------------------------
这种方法是可以尝试的,这种方法在大部分时候可以捕获异常。

Application.ThreadException 也是一种很好的方法,另外如果你有辅助线程的话,辅助线程的入口处,也要Try...Catch处理


还有,既然.net平台可以提示错误,说明这个错误是可以被捕捉的,因为.net平台是最后一道防线,专门用来捕捉你没有捕捉到的东西。.net平台有内置的异常处理机制。
所以该错误还是可以被捕捉的,建议你Reflector 一下.net的异常处理机制,看看有没有更好的办法来进行捕捉。 --------------------编程问答-------------------- 顶起来了 --------------------编程问答-------------------- 不能就这样沉下去 --------------------编程问答-------------------- 不能就这样沉下去a --------------------编程问答-------------------- 不沉也没有法子,非托管的就这样——就是不受你管的

这次不带尾巴了
~~ --------------------编程问答-------------------- 算了
准备结贴了,多谢各位…… --------------------编程问答-------------------- 关注,如果在winform运行正常,估计代码应该没有什么大问题 --------------------编程问答-------------------- 你为什么不和那家公司联系一下那? --------------------编程问答-------------------- 在C#中,申明Api方法时DllImport有一参数SetLastError,设为True(C#默认为false),在代码调用dll方法之后,再调用
int er = Marshal.GetLastWin32Error();
这样就可以捕捉到错误代码.
--------------------编程问答-------------------- Bote_China的方法应该不错

1、不过如果对方也利用Try之类的进行了错误处理。。。。
2、如果是DLL和系统环境的冲突造成的崩溃。。。 --------------------编程问答-------------------- 试试

在WinForm程序和第三方非托管的dll之间添加一个新非托管的dll,新的dll处理第三方非托管的dll的异常,WinForm程序通过新的dll使用第三方非托管的dll功能

WinForm程序 -〉第三方非托管的dll

进化

WinForm程序 -〉新的dll -〉第三方非托管的dll

--------------------编程问答-------------------- try
{
//
}
catch // 这里什么都不写
{
  //出错处理
}
只能捕获托管的异常,非托管的异常捕获不了 --------------------编程问答-------------------- 楼主可以查以下你的传参是否有问题,当然由于没有DLL你是很难确定,主要靠多实验

如果还是不能解决问题,你可以另外包一层,用开发这个DLL的语言包,然后看看你传的为什么错误

这样一般可以解决问题. --------------------编程问答-------------------- 这是没有办法的,这个程序主要是负责给电信的网关收发短信,而这个dll是电信指名推荐的一家杭州公司开发的dll,他们只有Win 32的,没有.net做的组件,所以麻烦啊,我的WinForm代码应该是没有什么问题的
=================================
呵呵,我也做过类似功能。第三方提供给我的dll文件,注册成COM组件。
后来我用类型库导入程序(Tlbimp.exe)将COM 类型库中的类型定义转换为公共语言运行库程序集中的等效定义。用起来和.net的类库一模一样。
不知道你的dll文件是否能注册成COM组件?
--------------------编程问答-------------------- to patrickpan(离别钩)
我的dll不是Com哦,我在上面已经说清楚了,是动态链接库,调用和调用Win32 API一样
如果是COM还好办点了 --------------------编程问答-------------------- haolaiwu(宁愿相信世界上有鬼,也不相信女人那张嘴) ( ) 信誉:100    Blog   加为好友  2007-6-28 8:46:35  得分: 0  
    
注明:
这个dll是Win32动态链接库,不是COM

--------------------------------
在发完帖的时候就补充了,哈哈
patrickpan(离别钩)有什么好的办法吗

  
 
--------------------编程问答-------------------- 这个问题估计又是一个无法解决的问题了……对.net来说 --------------------编程问答-------------------- for win32 api,

GetLastError() is the only choice, no other way.
--------------------编程问答-------------------- it is not a problem for .Net.

in C++, if you want to use Win32 API, u also need to check the result yourself, not use try catch.

So, make it clear, Win32 API is written in C, not C++.

C++/C#/Java all have try{} catch{}, but C not.
--------------------编程问答-------------------- to shrinerain(圣影雨) 
It's written in VC++,
How can i do? --------------------编程问答-------------------- 这个dll是VC++6.0写的
调用是在C#中调用

GetLastError() 怎么用? --------------------编程问答-------------------- GetLastError和这个没联系的,这个只是用全局变量来返回函数执行状态的而已。
比如使用某个api。返回结果和期望的不同。但不知道为什么返回的不是自己想要的,就用GetLastError获得错误信息,到WINERROR.H里找错误的宏,知道为什么错误。同样这个开放给用户使用,可以用SetLastError设置错误编码,然后用GetLastError获得错误信息,不过这个就只有自己约定,不可以找WINERROR.H了。


异常和这个无关。你不可以通过公司,去找对方公司反映情况么? --------------------编程问答-------------------- 我刚写了个vc的dll
extern "C"
{
  _declspec(dllexport) int IncludeExceptionFunction();

}

int IncludeExceptionFunction()
{
throw;
return 0;
}

就这样而已。用.net调用。try,catch貌似可以捕捉到异常的。 --------------------编程问答-------------------- to wuyazhe
可以捕获到吗?你确定? --------------------编程问答-------------------- 唉!!!!! --------------------编程问答-------------------- GetLastError确实与api函数中对异常的处理方法相关,在Api函数中,只有进行了SetLastError操作,在调用线程中GetLastError才可以捕获到上次调用Api函数的错误代码.托管C++中用throw方法抛出异常,用try catch是可以捕获异常的. --------------------编程问答-------------------- VC中捕获异常都分COM异常和VC自己异常

而且托管语言无法处理NULL指针的

LZ还是找那个DLL的开发者好了 --------------------编程问答-------------------- 同意:amandag(高歌) 
try
{

}
catch  //什么也不写
//捕获非托管代码异常
//在C#高级编程中有提到这一点
{

}
--------------------编程问答-------------------- JGood() ( ) 信誉:100    Blog   加为好友  2007-06-30 12:19:46  得分: 0  
 
 
   同意:amandag(高歌) 
try
{

}
catch  //什么也不写
//捕获非托管代码异常
//在C#高级编程中有提到这一点
{

}

  
 


还有这样一说啊。我就是不知道类型。所以什么也没写。莫非就是这样?






[DllImport("ThrowExceptionDll.dll", EntryPoint = "IncludeExceptionFunction")]
        public static extern int IncludeExceptionFunction();

        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                IncludeExceptionFunction();
            }
            catch
            {
                MessageBox.Show("handled exception.");
            }
            finally
            {
            }
        }


 haolaiwu(宁愿相信世界上有鬼,也不相信女人那张嘴) ( ) 信誉:100    Blog   加为好友  2007-06-30 08:58:19  得分: 0  
 
 
   to wuyazhe
可以捕获到吗?你确定?
  
 

确定阿。要不你自己建个vc的dll,或者留邮箱我发给你测试点代码。 --------------------编程问答-------------------- 看来也不一定说什么都不写才可以。因为我改成
catch(Exception ex)
一样可以捕获。


楼主,我猜啊。可能是他dll里开了线程了。不在自己线程度异常可能自己捕获不到的。猜测而已。试试区。 --------------------编程问答-------------------- 貌似应该是线程发出的异常。这个异常不是你线程的,所以你捕获不到。我自己这样测试也无法捕获到:
private void button6_Click(object sender, EventArgs e)
        {
            ThreadStart TestThreadFunction = delegate()
            {
                throw new Exception();
            };

            Thread th = new Thread(TestThreadFunction);
            th.Start();
        }

引发的异常捕获不到。我一样也在static void Main()中注册了事件。


Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);


对于这样的,没考虑过。记得以前写的控件,就是因为觉得线程异常不好处理。所以我都把线程度异常转换成事件来作了。使用我控件的,如果注册ErrorHappend,就可以知道我线程中异常内容。对于c++的dll。不知道如何做。再继续查查。 --------------------编程问答-------------------- 你注册这个事件:AppDomain.CurrentDomain.UnhandledException
可以捕获到异常的话,说明是在其他线程的异常了。不过捕获到后,程序还是会退出。继续查。 --------------------编程问答-------------------- 投降了。我写了个带有线程的vc dll,线程里就抛出异常而已。所有之前方法都失效,无法捕获盗c++写的线程里抛出的异常。看来楼主最好还是想办法联系一下提供dll的公司。让他们改用SetLastError来设置全局错误信息的方式,或者发送自定义消息给你,他自然有办法要求你提供线程ID或者窗体Handle之类的。我想这个方法是比较简单和可行的。

关注是否有更好方法。 --------------------编程问答-------------------- 我的e-mial:
jrt324@126.com

麻烦你发你的dll给我测试一下 --------------------编程问答-------------------- 多谢wuyazhe
如果是Windows API,其实SetLastError然后GetLastError应该是可以的

不过我的这个dll估计没有写规范,正如你所说的,让他们改用SetLastError来设置全局错误信息的方式,哈哈,希望你能发你的dll的代码给我,对了,我这里没有装c++编译环境 --------------------编程问答-------------------- 不知道楼主的问题解决了没有,大家帮忙看看这个

http://topic.csdn.net/u/20110420/18/1e5f390d-6970-4e87-916f-bfaaf5896d81.html 

补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,