.net 服务多线程 调用非托管C++DLL 如何防止 服务崩溃?

有一个.net服务,服务中开了多线程。其中有一线程会去调用非托管C++DLL,并阻塞等待其返回值。其他线程同步做文件处理、数据状态更新等操作。现在调用非托管C++DLL的线程会因为非托管代码的问题,崩溃。这样整个服务也就崩溃了!需要人工去服务器上重启该服务!请问:如何防止整个服务崩溃?是否可以捕获非托管C++中的错误。因为已经try catch了,但什么都捕获不到,直接服务崩溃!

0

6个回答

这个应该要想办法解决C++ DLL的bug

0

只有在C++ 的DLL代码中try..catch.把异常抛出来,才能捕获得到。除非捕获得了异常,不然怎么防止崩溃呢,,,不知道

0

还是先确定是哪个的问题?是调用的问题还是C++dll库本身的问题?

0

确定问题在C++的DLL中(只要调用某个非托管方法就100%会崩溃),但是因为没有改DLL的源代码,所以无法修改。在网上找到一些利用AppDomain和Application.ThreadException的方法,但尝试后并未成功。可能是多线程的问题吧。

0

问题有点类似这个帖子http://bbs.csdn.net/topics/380218300 不同之处,他是exe,我是服务,服务无法防止崩溃。

0

这个应该要想办法解决C++ DLL的bug

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
非托管异常处理方法……
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace supervise{    class Program    {        /// <summary>        ///         ...
超详细解析托管与非托管
1      DLLImport的使用using System;using System.Runtime.InteropServices; //命名空间class Example{//用DllImport 导入Win32的MessageBox函数    [DllImport("user32.dll", CharSet =CharSet.Unicode)]public static extern i...
.net4.0调用非托管DLL的异常捕获
由于有些非托管的DLL内部异常未有效处理,当托管程序调用到这样的DLL时,就引起托管程序意外退出。 托管程序使用通常的捕获try……catch块不起作用。原因是.NET 4.0里新的异常处理机制引起。 在4.0以前,因为SEH异常被转换成了跟普通.NET异常相同的异常,这样程序员只要用catch ( Exception e)的模式就可以捕捉到所有的异常。这样处理的问题是,由于SEH异常通常都不
编写C++非托管DLL以及在.NET托管中调用
编写C++非托管DLL以及在.NET托管中调用   新建项目,来到Win32,点击Win32项目 输入名称MyVC点击确定。 应用程序类型,勾选DLL,点击完成。     MyVC.cpp   #include "stdafx.h" #include   extern "C" __declspec(dllexport) int Max(int a,int
C# 中如何调用DLL文件(分两种情况,托管与非托管)
C# 中如何调用DLL文件? 2010-11-28 08:46yanghao717  分类:C#/.NET | 浏览 14452 次  C#编程 我在网上找了好久都没看明白,所以来这里请教高手们了,比如我将一个y.cs这个文件编译成y.dll放在 D:\ 下,y.dll文件中有一个print()方法。现在,我新建一个类x.cs,我要在这个类里调用y.dll,请问有几种方法?哪种最
c++ 非托管程序调用c#托管程序l的实现操作方式
非托管的c++程序调用c#的托管程序的创建过程和相关代码。对于一些特别注意事项也做了说明。希望对大家有所帮助,相互学习。
非托管C++程序中调用C#的dll
    刚去的新公司分配了我一个项目需求,将PPT文件(包括*.ppt和*.pptx)转换成多张png图片。由于以前只有native C++的经验,在网上逛了多圈后,发现都是使用C#实现这个功能的,被这个需求折磨了几天后,今天终于把这个问题解决了。所以在此记录下解决这个项目需求的总结。     C#的程序代码在非托管的C++环境中使用有三种方式:1.平台调用技术(P/Invoke)。2. C++...
C#调用托管DLL与非托管DLL
DLL之前使用过几次,但是最近使用时,又出各种问题。最后弄到晚上十二点多了,看到网上一个创建DLL的图解教程,按上面的讲解,成功实现了C#调用自己创建的DLL。之所以耗了这么久时间,是因为我本想凭自己记忆实现DLL创建调用,但是各种问题随即产生。。。(不说了,割了)。。今天上午再次整理,觉得有必要记录。 C#调用DLL,有很多详尽的博客讲解。我此处只记录简单的两种,我在项目中只用到这两种。
关于Dll、Com组件、托管dll和非托管dll的理解
Com组件和dll区别: 1.普通dll不能通过regsvr32.exe来注册,而Com组件能通过regsvr32.exe注册。  2.Com组件是微软的一个协议,满足com组件协议的dll文件就是com组件,这种协议为了跨语言、跨平台使用,dll组件需要编译后使用,而Com组件注册后即可使用。 而dll是动态链接库,是一个可以导出函数的集合。 3.Com组件可以是exe也可以是dll文件
Java 使用JNative调用dll出现tomcat服务异常停止
   环境:    jdk1.7_32位    window server 2012    tomcat7.0安装版概况:在项目开发中,使用java的JNative调用window下的dll文件,在项目上线的初期试点,业务量不大的时候一切正常,但是随着使用的用户量变大,tomcat的服务会不定期的停止,出现保存文件hs_err_pid2844和hs_err_pid2844.mdmp文件,打开hs_...
使用平台调用(PInvoke)实现C#调用非托管C++代码
1.问题描述众所周知,不同的语言有不同的优势,如何让不同的语言在一个程序中“各司其职”、“分工协作”一直是一个人们想要达到的目标。有许多时候,我们需要用C#语言调用C++语言写成的代码:一方面,C#在编写GUI时更加方便(因为有WPF),而C++的执行效率之高是实现许多复杂算法的首选语言;另一方面,许多既有代码是通过C++语言编写的(各种库,甚至Win32API),我们也有在C#中重用既有C++代码
ASP.net 不能加载一个托管dll使用的非托管dll
问题: ASP.net工程使用一个托管的dll,这个托管的dll又使用一个非托管的dll。 当工程使用托管dll的方法时,会使用非托管的dll的方法,会报错: Activation library component not found, function failed(90000001, 1) 经过搜索,没有找到解决方法,只有几个类似的问题: 1.将非托管的dll再生成一个封装
C#内存泄漏 非托管堆内存泄漏
<br />刚进实验室,老师给我一项任务:一个已经开发好的软件,有两个BUG,要我去改。软件是用C#写的,这个以前没搞过C#。所以就一边看书学习一边看代码。<br />第一个BUG其实严格来说不叫BUG,而是功能的完善:目前软件的日志只能在本软件中保存和打开查看,我需要把日志以Word文档形式导出来。这个功能的实现我用了大概一周就基本完成了。后来就把精力全放在第二个BUG上了。第二个BUG是:本软件要调用外部COM组件,但是在执行某些COM组件时,程序运行到一半就自行退出,崩溃了。听说以前有多个同学搞过这个
dll 线程调用游戏主线程,30分-1小时崩溃
问题:dll 注入游戏后,开线程 自动选怪-》判断是否可攻击-》攻击 while(1) {     if(选中 && )     {          if(是否可攻击)        {                攻击         }     }else     {          循环当前场景怪物,回去最近怪物并选中;     }    sleep(
C#调用非托管代码(转)
C#调用非托管代码(转) 在.net 编程环境中,系统的资源分为托管资源和非托管资源。   对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的 只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。托管代码就是基于.net元数据格式的代
C#调用非托管C++DLL的两种方法
C#编写的代码属于跨平台的托管代码,C++语言可以编写托管(managed)和非托管(native)代码。在C#与C++的混合编程中,经常会使用C#来调用native C++的DLL,下面有两种常用的调用方法供大家参考。 使用P/Invoke直接调用native C++ Dll 里面的函数。(注:此方法只能调用函数,不能调用class)。 C#通过C+
C# 调用 C++ DLL(1) 非托管方式:直接调用C++方法
一.直接调用c++的里面的方法 [DllImport(&quot;user32.dll&quot;, EntryPoint = &quot;GetWindowLong&quot;, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int GetWindowLong(HandleRef hWnd, int...
C#调用非托管DLL(数据类型)
原文连接: http://blog.csdn.net/so927/article/details/9426971  C#时常需要调用C++ 编写的 DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家:     VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等
C#调用C++的dll两种方法(托管与非托管)
C#调用C++的方式分为两种:(1)非托管的方式进行调用;(2)采用托管的方式进行调用。 一、使用非托管类调用C++的dll。 1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示   2、添加MyDLL.cpp源文件,其中代码: #include  #include  extern "C" _ _declspec(dllexport) void Sho
C# 使用代码实现非托管dll、OCX动态注册
一般我们注册VB的ocx控件或者其他的dll需要手动在控制台命令中用regsvr32来注册,其实就是调用dll中的DllRegisterServer方法,用c#的DllImport也可以调用该方法,但是DllImport的路径必须是静态字段,不能动态的,我们可以使用kernel32中的两个函数来实现动态调用:LoadLibrary和GetProcAddress,调用完成之后再FreeLibrary...
纯C# 托管与非托管DLL注入 FastWin32源码
纯C# 托管与非托管DLL注入 FastWin32 dll注入库,此代码无需额外DLL
.net内存释放(托管堆与非托管堆的释放)
托管堆: 1、垃圾回收器     .net的运行库采用的是垃圾回收器来回收的方式。垃圾回收器本身也是一个程序。程序动态请求的内存都分配到堆上,在.net中,CLR维护它自己的托管堆供.net程序使用。       每隔一段时间.net就会检查托管堆,当检查到需要清理堆时,.net就调用垃圾回收器这个程序。垃圾回收器会扫描堆上的对象的引用,不再有引用的对象就被删除。       垃圾回收器调
c#调用非托管dll
c#调用非托管dll c#调用非托管dll c#调用非托管dll c#调用非托管dll
C# 调用 C++ DLL(3) 非托管方式:直接调用C++方法(使用范例)
1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示   2、添加MyDLL.cpp源文件,其中代码: #include &amp;lt;cv.h&amp;gt; #include &amp;lt;highgui.h&amp;gt; extern &quot;C&quot; _ _declspec(dllexport)void Show()   {   IplImage *img = cvLoadImage(...
C# 调用 C++ DLL(2) 非托管方式:直接调用C++方法(类型转换)
extern&quot;C&quot;__declspec(dllexport)bool方法名一(constchar*变量名1,unsignedchar*变量名2) extern&quot;C&quot;__declspec(dllexport)bool方法名二(constunsignedchar*变量名1,char*变量名2) C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 c++: HAN...
纯C#实现注入任意DLL(托管/非托管),无需额外DLL,AnyCPU编译支持x64/x86 win10/win8/win7/xp
纯C#实现注入任意DLL(托管/非托管),并非网上流传代码需要c++编写dll用于启动CLR,此代码无需额外DLL,AnyCPU编译支持x64/x86 win10/win8/win7/xp
非托管C++调用C#的dll
C#调用C++编写的dll,一般都是直接用dllimport,这个资料很多。C++调用C#编写的dll,一般方法都是先用托管C++将C#的dll进行一次封装,然后由非托管C++调用封装好的dll。
在VS2010上使用C#调用非托管C++生成opencv代码的DLL文件
背景       在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。   步骤 1. 创建一个CSharpInvokeCPP的解决方案:   2. 创建一个C++的动态库项目:   3
调用非托管DLL参数问题
c# 调用非托管DLL参数问题调用非托管DLL参数调用非托管DLL参数问题
多线程调用DBUS服务注意事项
多线程调用DBUS服务注意事项 多线程调用DBUS服务注意事项 多线程调用DBUS服务注意事项 多线程调用DBUS服务注意事项
C#中调用非托管的DLL及参数传递 (一)
微软的.NET框架的优点之一是它提供了独立于语言的开发平台。你可以在VB、C++、C#等语言中编写一些类,而在其它语言中使用(源于.NET中使用了CLS),你甚至可以从另一种语言编写的类中继承。但是你要是想调用以前的非托管DLL,那又会怎么样呢?你必须以某种方式将.NET对象转换为结构体、char *、函数指针等类型。这也就是说,你的参数必须被marshal(注:不知道中文名称该叫什么,英文中
C#不能调试非托管C++代码问题
vs2013开发C#调用C++的DLL,C++非托管。调试代码时发现C++的断点无法进入,如果把C++代码设为启动项目,C#的断点又无法进入。 解决方案:设置C#项目的属性,具体: 属性-》调试-》启用调试器-》启用本机代码调试 设置好后,C#设为启动项目,就可以正常调试非托管C++代码了。
C# 托管代码和非托管代码
托管代码托管代码就是Visual Basic .NET和C#编译器编译出来的代码。编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。通常来说,这个拷贝的动作就是部署流程中唯一的一个操作。托管代码在公共语...
将托管dll注入到非托管进程中
Binhua Liu Demo源代码 457K   为什么要写这篇文章 1,如果你想注入带窗体的dll,C#写界面比C++容易的多; 2,或许你想利用.net的某些功能,比如利用.Net Remoting从外部控制被注入的dll; 3,或许你是一个C#程序员,使用C#的时候总感觉更舒适些,比如笔者。同时,你希望必要时也能在宿主中调用C++函数,提供更大的灵活性,本文的方法也能做到。
例子程序:C#与C++的混合编程 之二 使用非托管dll 导出标准函数
例子程序:C#与C++的混合编程 之三 使用非托管dll 导出标准函数
CLR C++ 托管与非托管
一.将源代码编译成托管代码 1, CLR(Common Language Runtime)公共语言运行时是一个可由多种语言使用的“运行时”,CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用。如“运行时”使用异常来报告错误,所以面向“运行时”的所有语言都能通过异常来报告错误。 2, 可以将编译器视为语法检查器和“正确代码”的分析器,他们检查你的
C#调用C++接口导致内存越界——引起程序崩溃
问题描述:    接口调用后,功能正常,但是软件操作若干次后(单击界面、图像操作、图像浏览等任意操作),软件直接崩溃到C#程序入口处,错误提示中错误代码0x00000005,明显是内存访问越界等典型问题;分析解决问题:    但是检查代码并确认无内存泄漏(注意:不是内存泄漏的问题造成的,却朝着内存泄漏的方向走下去,结果就是无头绪),一次次确认都不行,但是注释掉接口函数内部所有代码,只保留retur...
jni 调用dll jvm崩溃的可能
1  dll用release输出2  如果从java中传入对象到native,对象中的部分非基本数据属性不能为空3  byte数组拷贝返回java,不能用memcpy,要用SetByteArrayRegion,unsigned char* 可以强制转换为(jbyte*)4 释放指针的问题。...
C#动态调用非托管DLL
尝试着在C#下调用以前Delphi写的一些DLL,基本实现动态调用,传入回调函数,及调用带结构数组指针作为参数的函数.     虽然DllImport可以方便的静态调用DLL的函数,但在.net2.0中新增加了一个Marshal.GetDelegateForFunctionPointer 方法,可以将非托管函数指针转换为委托。 有了这个方法就可以用三个Windows API函数即:Loadli
发现并防止托管代码中出现内存泄漏,C# 内存泄漏,.net 内存泄漏
一提到托管代码中出现内存泄漏,很多开发人员的第一反应都认为这是不可能的。毕竟垃圾收集器 (GC) 会负责管理所有的内存,没错吧?但要知道,垃圾收集器只处理托管内存。基于 Microsoft® .NET Framework 的应用程序中大量使用了非托管内存,这些非托管内存既可以被公共语言运行库 (CLR) 使用,也可以在与非托管代码进行互操作时被程序员显式使用。在某些情况下,垃圾管理器似乎在逃避自己
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 服务产品经理 大数据培训服务