感觉是回调函数调用有问题,
但是也很奇怪,为什么用开发工具编译运行没有问题,
但是直接运行EXE程序就报错误。项目-->属性-->生成-->勾选"允许不安全代码"
也同样有这个"代理函数被回收"的错误。
=======================
项目-->属性-->调试-->勾选"启用非托管代码调试"
调试时的提示信息如下:托管调试助手“CallbackOnCollectedDelegate”
在“桌面\testDLL\bin\Debug\testDLL.exe”中检测到故障。
其他信息: 对“testDLL!testDLL.Form1+LPONGETMSG2::Invoke”
类型的已垃圾回收委托进行了回调。
这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,
托管应用程序必须让这些委托保持活动状态,
直到确信不会再次调用它们。
=======================
项目-->属性-->生成-->配置下拉框选择"Release",有是同样的错误。
但是也很奇怪,为什么用开发工具编译运行没有问题,
但是直接运行EXE程序就报错误。项目-->属性-->生成-->勾选"允许不安全代码"
也同样有这个"代理函数被回收"的错误。
=======================
项目-->属性-->调试-->勾选"启用非托管代码调试"
调试时的提示信息如下:托管调试助手“CallbackOnCollectedDelegate”
在“桌面\testDLL\bin\Debug\testDLL.exe”中检测到故障。
其他信息: 对“testDLL!testDLL.Form1+LPONGETMSG2::Invoke”
类型的已垃圾回收委托进行了回调。
这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,
托管应用程序必须让这些委托保持活动状态,
直到确信不会再次调用它们。
=======================
项目-->属性-->生成-->配置下拉框选择"Release",有是同样的错误。
解决方案 »
- Asp.net Dev 页面请求使用线程阻塞,会导致整个程序阻塞,请问有什么办法可以不阻塞?
- 答题器制作
- 初始化页面前加个进度条
- 日期交集问题
- VS2005找不到DataSetSurrogate的命名空间
- C#开发IM(即使通信 jabber_net)如果现线多对一的聊天
- 大哥们我的QQ被盗了,怎么办?
- Duwamish7中都是继承的dataset,和新new一个dataset效果有什么不同呢?
- 在窗体上画图形问题
- 找一個舊貼(有1到16個數字,甲先生:“我不知道这數字。” A先生:“我知道你不知道这數字。” C先生:“现在我知道这數字了。”C先生:“
- 使用Panel的DrawToBitmap截图打印时,控件层次问题。
- 带SQl数据库的C#winform发布部署
http://developer.51cto.com/art/200909/150396.htmC#中调用 调试C++的DLL
http://blog.csdn.net/jaylongli/archive/2010/06/01/5638598.aspxC#动态调用C++编写的DLL函数
http://www.zxbc.cn/html/20080508/34128.html
调用C++编写的DLL程序,用到了一个回调函数.
//通过回调方式接收C++制作的DLL,传回的数据
//在VS2005环境下,直接编译运行没有报错
//但是但是直接运行EXE程序出现系统异常
public partial class Form1 : Form
{
//C++函数原型
//typedef int(CALLBACK *PFCALLBACK2)(unsigned char *&ucData, int *dataLen); //定义代理函数
public delegate int LPONGETMSG2(ref IntPtr data, ref int retVal);
[DllImport(@"MFCDLL.dll", EntryPoint = "RegisterCallBackFunc2", CharSet = CharSet.Ansi)]
public static extern void RegisterCallBackFunc2(LPONGETMSG2 CallbackFuncs2); //回调方式接收DLL传回的数据
//把data中的数据拷贝到newm数组中
private int funcTest2(ref IntPtr data, ref int retVal)
{
byte[] newm = new byte[retVal];
Marshal.Copy(data, newm, 0, retVal);
//执行绘图操作 return 0;
} //注册代理函数
private void button1_Click(object sender, EventArgs e)
{
//C++函数原型
//extern "C" __declspec(dllexport) void RegisterCallBackFunc2(PFCALLBACK2 Func2);
RegisterCallBackFunc2(funcTest2);
}
}
被回收的原因,可能是下面两行代码有异常,
但是在编译运行的时候没有错误。private int funcTest2(ref IntPtr data, ref int retVal)
{
byte[] newm = new byte[retVal];
Marshal.Copy(data, newm, 0, retVal); //======================
在网上看资料介绍,使用GCHandle.Alloc为这个委托建立一个句柄,
或者定义static类型的委托,具体不太清楚如何修改。
哎,我太死板了,居然连使用static的方法都没想到,惭愧啊!!
谢谢这位兄弟提醒