C#调用第三方dll异常 高手来看看怎么处理

liuhongwei90 2010-06-25 04:06:34
试图在不先将托管代码转换出的情况下调入它们。不要试图在底层本机扩展性点(如向量异常处理程序)内运行托管代码,因为这样会导致损坏或数据丢失。

就这个异常 有人看到过没?
...全文
1013 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
maozhu_yimi 2010-08-30
  • 打赏
  • 举报
回复
鄙视29楼,
csdn是让大家学习的地方,你这样搞,不是浪费大家时间吗?

更隐隐觉得,他就是一忽悠,其实自己根本不会,只是骗分的
Jia_Ma 2010-06-26
  • 打赏
  • 举报
回复
在使用第三方动态连接库时的错误吗?我以前遇到过,部分代码段无法调试。给我个邮箱,我发解决方案给你
yao2004jessica 2010-06-26
  • 打赏
  • 举报
回复
you dian nanban
yilaozhuang 2010-06-26
  • 打赏
  • 举报
回复
路过,学习下,第三方的dll能保证正确不
loveSoftandhxy 2010-06-26
  • 打赏
  • 举报
回复
检查堆栈跟踪以确定激活此 MDA 的线程。 该线程正在尝试非法调入托管代码。 堆栈跟踪应该显示使用此扩展性点的应用程序代码、提供此扩展性点的操作系统代码和被该扩展性点中断的托管代码。

例如,在尝试从向量异常处理程序内部调用托管代码时,您将看到该 MDA 被激活了。 在堆栈上,您将看到操作系统异常处理代码和一些触发诸如 DivideByZeroException 或 AccessViolationException 等异常的托管代码。

在此示例中,正确的解决办法是完全以非托管代码实现向量异常处理程序。




参考:http://msdn.microsoft.com/zh-cn/office/ms172237.aspx
kid_wang 2010-06-26
  • 打赏
  • 举报
回复
楼主,你贴的那段代码根本不是出场的地方,而是最后错误返回的地方,你要贴调用dll的代码,这样才能知道是哪个地方出问题了。
看那个提示,不再托管代码转换出就调入,可能说明这个dll是非托管的代码,在你调用的时候没有被CLR转换
成托管代码。

你可以参照:http://msdn.microsoft.com/zh-cn/magazine/cc164193.aspx
zhu_jiang 2010-06-25
  • 打赏
  • 举报
回复
不用贴了,贴了也没用,怎么异常信息都不会有的,断下来的位置都不是异常产生的地址,异常信息也是全是空白,按我的方法去找把
parellax 2010-06-25
  • 打赏
  • 举报
回复
贴代码出来先....
jianuMan 2010-06-25
  • 打赏
  • 举报
回复
贴代码吧

这样看不出来
zhu_jiang 2010-06-25
  • 打赏
  • 举报
回复
你那个应该是三方的托管类库,用peid检查下是什么语言写的吧,如果是托管类库那么修复工作应比较简单,
如果是非托管,好像更简单,搞不定就开个300分贴子,我看见了帮你搞下
doubleu2005 2010-06-25
  • 打赏
  • 举报
回复
还是从头查一遍吧
zhu_jiang 2010-06-25
  • 打赏
  • 举报
回复
IDA pro

不清除楼主需求是什么,但普通程序是用不着这些的
liuhongwei90 2010-06-25
  • 打赏
  • 举报
回复
可以推荐一个C++  的反编译工具么
应该是那个第三方类库的问题

那个东西我用C++自带的那个 可以查看类库函数列表的那个东西
还打不开
只能看到他调用了kernel32 和其他几个dll
zhu_jiang 2010-06-25
  • 打赏
  • 举报
回复
这种处理方法连断点都能拦截,可惜,托管代码写总会存在点问题
zhu_jiang 2010-06-25
  • 打赏
  • 举报
回复
检查你的程序,看那个位置封装了Kernel32.dll中的addVectoredExceptionHandler,
RemoveVectoredExceptionHandler,然后在程序中找到封装的方法,再检查那个位置引用了这个方法,把它给去掉.
zhu_jiang 2010-06-25
  • 打赏
  • 举报
回复
做过,因为你使用托管代码封装了veh异常处理,这样就会优先于结构化异常调用,也就是说可以截获任何异常了,我曾经用托管代码这样写过,结果是我的调试器基本失去了调试作用
结论,改用vc++封装了自己的veh异常
allen3010 2010-06-25
  • 打赏
  • 举报
回复
学习来了
liuhongwei90 2010-06-25
  • 打赏
  • 举报
回复
MainForm 没有鼠标事件
xk1126 2010-06-25
  • 打赏
  • 举报
回复
代码代码代码!
huwen7565833 2010-06-25
  • 打赏
  • 举报
回复
对MainForm 的代码!!!
加载更多回复(10)
NET程序员的开发利器.NET Reflector 一、 简介   程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见拙。因为,Reflector能提供更多的程序集信息,而且是免费的工具。   如今,在Visual Studio.NET中编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软中间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。   基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。   二、 下载与运行Reflector   Reflector是由微软员工Lutz Roeder编写的免费程序。这个软件经常更新,你可以在http://www.aisto.com/roeder/dotnet下载最新的版本。在本文成文之时,Reflector的最新版本为5.0.35.0,仅有1M大小。只要双击下载后的Reflector.exe文件即可运行Reflector。   默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口中。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。   要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口中与其它默认程序集共同显示。要想从Reflector的主窗口中删除程序集,只需右击程序集并选择“Close”。   三、 使用Reflector反汇编程序集   提供基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单中的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。图2以C#语言展示了对SmtpClient类中Abort方法的反汇编结果。   有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。   不用太担心,你自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。   四、 Reflecator的其它功能   除了作为对象浏览器与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提供单键访问Google或MSDN搜索的能力并提供了允许第三方开发人员为Reflector创建插件的框架。   要查看调用或被调用图,只需要在树视图中选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。   通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行中的程序集、输出整个程序集的反汇编内容以及在Visual Studio中作为Reflector的宿主等的插件。还有更多插件都列在http://www.codeplex.com/reflectoraddins中。在此,我极力推荐有兴趣的读者前去一看。   不出乎所料,的确存在一个Reflector.VisualStudio插件。有了这个插件,就可以让Reflector集成在Visual Studio环境中,进而取代以前那个有些“拙漏”的对象浏览器。   首先,我们需要在机器上准备Reflector的最新版,然后从http://www.testdriven.NET/reflector下载最新版本的Reflector.VisualStudio插件。据说安装了此插件之后,Reflector能够与Visual Studio完美融合。但遗憾的是,本人试下载此软件并安装(仅能得到TestDriven.NET-2.8.2130 RTM个人测试版本,时间7/30/2007,大小3.3M)后,没有大发现—仅是在VS2005中添加“Go to Reflector”和一个帮助菜单项。点击“Go to Reflector”菜单项仅是从VS2005内部启动Reflector而已。   有了Reflector.VisualStudio插件(正版,下面是根据在线资料介绍),Reflector可以寄在Visual Studio中Reflector不仅是一个对象浏览器、反汇编器,包裹在同一个程序中的所有功能还可以寄于Visual Studio中。   五、 小结   还记得Spy++吗?在Win32时代,这个软件对于我们分析一个陌生软件的设计思路可谓立下汗马功劳。在如今的.NET时代,Reflector又成为每个严肃的.NET开发人员工具箱中必不可少的精髓工具之一。怎么样,请赶紧试锋吧。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧