Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DLLImport函数时程序崩溃 我试图使用C++中的函数来设置回调,我可以在程序中使用它,但是当我调用这个函数时,应用程序崩溃而不显示任何错误。p>_C#_C++_Callback_Pinvoke_Dllimport - Fatal编程技术网

C# 使用DLLImport函数时程序崩溃 我试图使用C++中的函数来设置回调,我可以在程序中使用它,但是当我调用这个函数时,应用程序崩溃而不显示任何错误。p>

C# 使用DLLImport函数时程序崩溃 我试图使用C++中的函数来设置回调,我可以在程序中使用它,但是当我调用这个函数时,应用程序崩溃而不显示任何错误。p>,c#,c++,callback,pinvoke,dllimport,C#,C++,Callback,Pinvoke,Dllimport,C#代码: [DllImport(“DocProc.dll”,CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Ansi)] 公共静态外部调用DPSetCallBacks(DPHandle hdl、IntPtr cbs); 公共代表无效连接CB(DPHandle hdl); 公共委托无效断开连接CB(DPHandle hdl); 公共代表void DocCompleteCB(DPHandle hdl); 公共代表void Doc

C#代码:


[DllImport(“DocProc.dll”,CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Ansi)]
公共静态外部调用DPSetCallBacks(DPHandle hdl、IntPtr cbs);
公共代表无效连接CB(DPHandle hdl);
公共委托无效断开连接CB(DPHandle hdl);
公共代表void DocCompleteCB(DPHandle hdl);
公共代表void DocImageCompleteCB(DPHandle hdl);
公共委托void DocImageSnippetCompleteCB(DPHandle hdl);
公共代表void DocReadCompleteCB(DPHandle hdl);
公共代表无效例外完成CB(DPHandle hdl);
公共代表无效例外程序CB(DPHandle hdl);
公共代表void FlowStoppedCB(DPHandle hdl);
公共代表void hoppemptycb(DPHandle hdl);
公共代表(DPHandle hdl);
公共代表无效机器ADCB(DPHandle hdl);
公共代表无效PoweredDownCB(DPHandle hdl);
公共代表无效PowerEDUCB(DPHandle hdl);
公共代表无效PowerIngUpPCB(DPHandle hdl);
公共代表无效读取CB(DPHandle hdl);
公共委托无效ReadyToProcessCB(DPHandle hdl);
公共委托无效状态例外(DPHandle hdl);
公共代表无效警告CB(DPHandle hdl);
公共代表无效NVMREADPILETECB(DPHandle hdl);
公共委托void MakeReadyToFlowCompleteCB(DPHandle hdl);
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
公共结构DPcbs
{
公共整数大小;
公共连接的CB连接的CB;
公共断开断路器断开断路器;
公共DocCompleteCB DocCompleteCB;
公共DocImageCompleteCB docImageComplete;
公共DocImageSnippetCompleteCB DocImageSnippetCompleteCB;
公共docReadComplete CB docReadComplete;
公共例外完成CB例外完成CB;
公共例外公共例外公共例外公共例外公共例外;
公共流量停止CB流量停止CB;
公共HopperEmptyCB HopperEmptyCB;
公营机构;公营机构;
公共机构发展局发展局;
公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力下的公共权力;
公共权力;
公共电力公司;
公共阅读CB READYNGCB;
公共ReadyToProcessCB ReadyToProcessCB;
公共州例外B州例外B;
公共警告CB警告CB;
公共NVMREADPleteCB NVMREADPleteCB;
公共MakeReadyToFlowCompleteCB MakeReadyToFlowCompleteCB;
}
C++代码:

typedef结构{
无符号整数大小;
连接的CB连接的CB;
断开断路器断开断路器;
DocCompleteCB DocCompleteCB;
DocImageCompleteCB docImageComplete;
DocImageSnippetCompleteCB DocImageSnippetCompleteCB;
DocReadCompleteCB docReadComplete;
例外完成CB例外完成CB;
例外不可压缩CB例外不可压缩CB;
FlowStoppedCB FlowStoppedCB;
HopperEmptyCB HopperEmptyCB;
Idleecb Idleecb;
MachineDeadCB MachineDeadCB;
PoweredDownCB PoweredDownCB;
powereducb powereducb;
PoweringUpCB PoweringUpCB;
ReadyingCB ReadyingCB;
ReadyToProcessCB ReadyToProcessCB;
StateExceptionCB StateExceptionCB;
警告CB警告CB;
NVMREADPleteCB NVMREADPleteCB;
MakeReadyToFlowCompleteCB MakeReadyToFlowCompleteCB;
}
无符号长DPSetCallBacks(dphandlehdl,DPcbs*DPcbs);
我这样使用它:

DPcbs cbs=new DPcbs();
cbs.powereducb=PoweredUp;
ptr=Marshal.AllocHGlobal(Marshal.SizeOf(cbs));
尝试
{
//将结构复制到非托管内存。
Marshal.StructureToPtr(cbs、ptr、false);
DPSetCallBacks(句柄,ptr);
}
最后
{
//释放非托管内存。
弗里赫全球元帅(ptr);
}

结果是应用程序在没有任何可见错误的情况下崩溃。任何帮助都将不胜感激。提前谢谢
请注意运行时编译的DLL版本

如果没有错误,它崩溃是什么意思?我看不到任何代码正在执行任何类型的输出,所以它不能成功完成吗?你是说控制台窗口要关了吗?在C#程序的末尾添加一个
Console.ReadLine()
。这是一个Windows窗体应用程序,只要运行该函数,应用程序就会退出。垃圾收集器可能会以某种方式运行,从托管代码调用时,托管指针就会消失。可能是这样的复制品:嗯,这和我做的不同。…C < <代码> ULUN <代码>是64位,C++ >代码>未签名的长< /C> > 32位。有大量关键代码段丢失,这可能是问题的原因。我们不知道调用约定是否匹配,代理是否受到保护而不被收集,而且可能还有更多潜在的陷阱。不幸的是,pinvoke问题缺少关键细节是很常见的。我真的不明白你的意思,你能澄清一下吗?谢谢。那么,这到底是如何回答这个问题的呢?