关于C#调用DLL和C线程回调C#代码问题,大家探讨下。。。。

问题描述

我使用VC创建了一个DLL文件,这个DLL文件唯一特殊地方是它创建一个线程,该线程可以回调C#代码?问题出现在回调几次后C#程序出错挂掉。VC程序如下:Test.DLLtypedefint(*InputFunction)();typedefint(*OutputFunction)();//全局变量InputFunctionSpexInputFunction=NULL;OutputFunctionSpexOutputFunction=NULL;intIsStop=0;HANDLEspexthread=NULL;DWORDspexthreadID;staticDWORDWINAPIThreadProc(LPVOIDlpParam){while(IsStop==1){Sleep(5000);SpexInputFunction();}SpexOutputFunction();return0;}//初始化函数指针intStart(SpeexInputFunctioninputfun,SpeexOutputFunctionoutputfun){SpexInputFunction=inputfun;SpexOutputFunction=outputfun;IsStop=1;spexthread=CreateThread(NULL,NULL,ThreadProc,NULL,0,&spexthreadID);}voidSpeexNativeStop(){IsStop=0;WaitForSingleObject(spexthread,INFINITE);CloseHandle(spexthread);}C#调用StartC语言创建一个线程,该线程回调C#中的函数。C#代码如下:publicdelegateintDelegateInput();publicdelegateintDelegateOutput();publicpartialclassForm1:Form{[DllImport("Test.DLL")]internalstaticexternintStart(DelegateSpeexInputinputfucntion,DelegateSpeexOutputoutputfunction);[DllImport("Test.DLL")]internalstaticexternintStop();publicstaticintInput(){//MessageBox.Show("InputFunction");return0;}publicstaticintOutPut(){//MessageBox.Show("OutPutFunction");return0;}privateDelegateInputspexinput=newDelegateInput(Input);privateDelegateOutputspexoutput=newDelegateOutput(OutPut);publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){intresult=Start(spexinput,spexoutput);//MessageBox.Show(result.ToString());}privatevoidbutton2_Click(objectsender,EventArgse){Stop();}}主要代码我已经写出来了,大家一起探讨下。现象是C创建的线程头几次回调是没有问题的,回调次数多了C#主程序就挂掉了。错误提示:中的0x0365bc00处未处理的异常:0xC0000005:写入位置0x03770000时发生访问冲突。

解决方案

解决方案二:
是不是有些资源还没来得急释放掉啊
解决方案三:
以前写过一个程序,调用别人C++写的dll,里面包含了n个线程。就是这个样子,调用几次,就挂掉。最后也没找到什么好办法,不过项目最后不做了。你试试,GC.KeepAlive(object),这个事件,当时是没有找到这个方法,也没有测试。你试试看行不行。
解决方案四:
没搞明白,是你C++程序使用.net编译的DLL,还是.net使用C++编译的DLL?
解决方案五:
尝试修改C++的函数。添加WINAPI。或者修改C#中的委托。设置CallingConvention=Cdecl。
解决方案六:
DLL文件是使用VC编译的。
解决方案七:
不是因为资源没有释放原因,在DLL中C语音创建一个非托管线程,C#程序无法管理那个非托管线程。如果是因为字节不对其造成的话,那就第一次回调时候就该失败了,可是在成功回调几次C#线程挂掉了,C创建的线程还一直运行着,这时候C#主界面就未响应了。有人说delegrate创建的函数指针和C语音中的函数指针是不一样的,由于对两个语音汇编原理不太清楚,我也不太确定。有时间大家可以尝试下。我现在改变思路了,用C#中线程循环调用DLL中代码,这样托管线程安全些。
解决方案八:
我也遇到类似的问题,帮忙顶!

时间: 2024-09-20 13:44:23

关于C#调用DLL和C线程回调C#代码问题,大家探讨下。。。。的相关文章

php调用dll的实例操作动画与代码分享_php实例

动画中的原代码如下: 复制代码 代码如下: VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "tw" Attribute VB_Glo

c# dllimport-DllImport 方法调用dll文件返回-4

问题描述 DllImport 方法调用dll文件返回-4 大侠们,我想问下我用下面方法调用dll文件,用方法openFile_DLL取值时返回值总是-4,请问是何原因?谢谢. [DllImport("GFileAnalysis.dll", EntryPoint = "openFile", CallingConvention = CallingConvention.Cdecl)] private static extern int openFile_DLL(strin

c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR

问题描述 c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR 最近使用C#编写一个摄像头的本地监控及录像程序,硬件开发商把所有的功能实现封装到DLL里了,我通过C#调用之. 具体要实现的功能如下: 1.摄像头通过DAS功能,主动向监控主机的IP发送数据. 2.监控主机监听固定端口,处理接收到的数据. 我自己的思路: 1.新建一个Dictionary存储已上线设备的信息. 2.程序初始化H264_DVR_Init(DisCallback, 0),DisCallback为

回调函数 dll-VC调用dll里面的回调函数

问题描述 VC调用dll里面的回调函数 我调用一个dll里面的回调函数,原型说明如下,请问怎么调用?感觉原型有问题,和我看的资料不一样 void (WINAPI SetCallback)(long caller,long userdata); 设置回调,回调函数将接收终端传过来的数据和消息 回调函数的参数为 Void CALLBACK eipcalback(int cmdtype,char *ip,char *rectime,char *lpn,char *imgfile,BYTE *imgda

Windows Service中调用dll 回调函数不执行(在线等)

问题描述 WindowsService中调用dll回调函数不执行,非回调函数正常:部分代码publicdelegatevoidGESCALLBACK(stringExtNum,intstatus);[DllImport("ExtStatusShow.dll")]publicstaticexternintRegGetExtStatusCBEvent(GESCALLBACKFunc);...publicvoid_UpdateExtStatus(stringExtNum,intstatus)

C#程序实现动态调用DLL的研究

原文:C#程序实现动态调用DLL的研究 C#程序实现动态调用DLL的研究 摘  要:在<csdn开发高手>2004年第03期中的<化功大法--将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决"DLL Hell"提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也

关于Java使用JNI调用C++动态库进行回调的问题

问题描述 最近需要学习JNI去调用C++动态链接库,所以写了个小实例试下JAVA调用C++库中的回调问题.代码如下JAVA层代码packagezm.com;publicclassLog{/***@paramargs*/static{//System.loadLibrary("JniLib");System.load("C:\VC_TEST\JniLib\Debug\JniLib.dll");}publicvoidoutput(Stringout){System.ou

在ASP文件中调用DLL

在ASP文件中调用DLL 动态联接库(DLL)是加快应用程序关键部分的执行速度的重要方法,但有一点恐怕大部分人都不知道,那就是在ASP文件也能通过调用DLL来加快服务器的执行速度,下面我简单的介绍一下在ASP文件调用DLL的步骤. 首先,必须得有DLL文件,本例是通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程. 在VB5.0的环境下,新建一个工程,并双击新建工程窗口中ActiveX DLL图标,VB将自动为项目添加一个类模块,并将该项目类型设置为ActiveX DL

在ASP文件调用DLL

动态联接库(DLL)是加快应用程序关键部分的执行速度的重要方法,但有一点恐怕大部分人都不知道,那就是在ASP文件也能通过调用DLL来加快服务器的执行速度,下面我简单的介绍一下在ASP文件调用DLL的步骤.    首先,必须得有DLL文件,本例是通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程.   在VB5.0的环境下,新建一个工程,并双击新建工程窗口中ActiveX DLL图标,VB将自动为项目添加一个类模块,并将该项目类型设置为ActiveX DLL.在属性窗口将