关于C# 调用 C dll时,抓获C的异常

  最近一直被C# 调用native code时的内存错误,各种错误所困扰。而且在.net 4.0中非托管代码的异常不能被托管代码抓获,导致程序直接crash。

  最终找到了.net 的方法。MSDN有关于expection 的详细解释

  1. 在.net 3.5中是可以抓取AccessViolationException这个C崩溃的异常的,因此可以尝试使用这个.net 3.5重新编译

  2.在.net 4,4.5中可以尝试在app.config 文件中加上如下的配置,

      

      <configuration>
        <runtime>
           <legacyCorruptedStateExceptionsPolicy enabled="true"/>
        </runtime>

     <configuration>

  3.为函数标记[HandleProcessCorruptedStateExceptions]

    

// This program runs as part of an automated test system so you need
// to prevent the normal Unhandled Exception behavior (Watson dialog).
// Instead, print out any exceptions and exit with an error code.
[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
public static int Main()
{
   try
     {
       // Catch any exceptions leaking out of the program CallMainProgramLoop();
     }
   catch (Exception e)
       // We could be catching anything here
     {
         // The exception we caught could have been a program error
        // or something much more serious. Regardless, we know that
        // something is not right. We‘ll just output the exception
       // and exit with an error. We won‘t try to do any work when
       // the program or process is in an unknown state!

        System.Console.WriteLine(e.Message);
        return 1;
     } 

  return 0; 

}

但是我使用第二种方法,仍然未解决问题,留待解决。

关于C# 调用 C dll时,抓获C的异常

时间: 2024-10-13 04:00:55

关于C# 调用 C dll时,抓获C的异常的相关文章

C# 调用第三方DLL缓冲区溢出导致的异常

这个倒是少见的错误,纪录一下大佬. 先上异常 错误一:尝试读取或写入受保护的内存 错误二:未将对象引用设置到对象的实例 错误三:  托管调试助手"FatalExecutionEngineError"(未能截图,网上找的,除了地址都是一样) 在此期间因为排查各种错误,代码删减所以报错才会异常不一样. 上代码: 方法:GetSHA256HashFromString 中间找错就不说了,代码瞎删,环境测试,实例更换 最后发现调用第三方DLL读字节是512,结果给的字节是64字节. 知道了哪里导

2015.3.5 VS2005调用VC6 dll 时结构参数的传递

结构只能以地址方式进行传递,dll只能传递结构不能传递类 VS端: [DllImport(@"D:\程序\VC程序\MfcDllspace\Debug\space.dll")] private static extern bool PassStruct(IntPtr skintptr); [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct sngk

python通过swig调用c++dll时指针的用法

当Python和C++的接口涉及到缓冲区时,可以在Python中创建缓冲区,再将缓冲区的指针传给C++函数(通过创建额外的函数进行转换).实例如下: Python端: 1.获取str表示的二进制数据(读取文件等). 2.利用ctypes包中的create_string_buffer(str)函数创建缓冲区. 3.获取int表示的缓冲区地址,利用addressof(buf)函数,buf为2中创建的缓冲区对象. 4.利用编写的额外转换函数int2voidp(address)函数将int转换为C++的

u3d调用c++ dll的DllNotFoundExceion 问题

原文地址:http://blog.csdn.net/boren31/article/details/8778504 问题年年有,今年特别多. 开发环境: Windows  XP sp3 Visual  C# 2010 Visual C++ 2008  (dll) 程序是用C#编写的; dll供应商给的,没有源代码,环境是VC++2008 用C#写了个调用C++ dll动态库程序,却报 System.DllNotFoundExceion 异常. 微软官方技术论坛给出的解释是: 当未找到在 DLL

2015.5.9 C#编写DLL及C#调用C#DLL

过程比C#调用VC++dll简单. 一.创建DLL 新建工程,类型选择类库,生成的结果就是dll 注意:在项目属性-应用程序中,注意三个地方,程序集名称和默认命名空间可以调整,但要一致,别的程序调用此DLL时,可通过using命名空间,而后类名+函数名调用.输出类型保持默认的"类库"不变. 此DLL中可以应用VC创建的DLL,但此时本DLL属性只能是X86.调用vc++dll方法还是用 [DllImport("space.dll")] public static e

无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”。此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来 自 HRESULT:

无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”.此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错. (异常来 自 HRESULT:0x80029C4A (TYPE_E_CANTLOADLIBRARY)) 经过多般折腾,还是没什么更好的办法.

C#调用dll时的类型转换总结

C++(Win 32) C# char** 作为输入参数转为char[],通过Encoding类对这个string[]进行编码后得到的一个char[] 作为输出参数转为byte[],通过Encoding类对这个byte[]进行解码,得到字符串 C++ Dll接口: void CplusplusToCsharp(in char** AgentID, out char** AgentIP); C#中的声明: [DllImport("Example.dll")] public static

JNI java调用动态链接库dll

现在做的项目中就用到了JNI调用c语言实现的访问设备的dll文件,在此之前对JNI是一窍不通哈,只听说过JNA链接dll,但只是一个了解. JNI(Java Native Interface)Java本地接口,主要作用是实现java代码与C C++编写的代码交互. 理论不多说,还是看java链接dll具体操作吧..如下: 以下实例为java中调用connection.dll文件中的 open()方法. 1,java方 1)装载dll文件 有两种方式System.load();和System.lo

C#调用C++ DLL 文件

说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开始从网上看到觉得挺麻烦的就没有仔细研究,如今看到别人写的文章,感觉也不是多难.下面分享一下: 1.整一个DLL 使用C++创建一个动态库项目,应用程序设置中选择“DLL” 打开CPPDemo.cpp文件,添加如下代码 #include "stdafx.h"extern "C&qu