Я пытаюсь использовать функцию из библиотеки C ++, которая устанавливает обратные вызовы, которые я могу использовать в программе в будущем, но когда я вызываю эту функцию, приложение вылетает без отображения ошибки или чего-либо еще.
C # код:
[DllImport("DocProc.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern ulong DPSetCallBacks(DPHandle hdl, IntPtr cbs);
public delegate void ConnectedCB(DPHandle hdl);
public delegate void DisconnectedCB(DPHandle hdl);
public delegate void DocCompleteCB(DPHandle hdl);
public delegate void DocImageCompleteCB(DPHandle hdl);
public delegate void DocImageSnippetCompleteCB(DPHandle hdl);
public delegate void DocReadCompleteCB(DPHandle hdl);
public delegate void ExceptionCompleteCB(DPHandle hdl);
public delegate void ExceptionInProgressCB(DPHandle hdl);
public delegate void FlowStoppedCB(DPHandle hdl);
public delegate void HopperEmptyCB(DPHandle hdl);
public delegate void IdleCB(DPHandle hdl);
public delegate void MachineDeadCB(DPHandle hdl);
public delegate void PoweredDownCB(DPHandle hdl);
public delegate void PoweredUpCB(DPHandle hdl);
public delegate void PoweringUpCB(DPHandle hdl);
public delegate void ReadyingCB(DPHandle hdl);
public delegate void ReadyToProcessCB(DPHandle hdl);
public delegate void StateExceptionCB(DPHandle hdl);
public delegate void WarningCB(DPHandle hdl);
public delegate void NvmReadCompleteCB(DPHandle hdl);
public delegate void MakeReadyToFlowCompleteCB(DPHandle hdl);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct DPcbs
{
public int size;
public ConnectedCB connectedCB;
public DisconnectedCB disconnectedCB;
public DocCompleteCB docCompleteCB;
public DocImageCompleteCB docImageComplete;
public DocImageSnippetCompleteCB docImageSnippetCompleteCB;
public DocReadCompleteCB docReadComplete;
public ExceptionCompleteCB exceptionCompleteCB;
public ExceptionInProgressCB exceptionInProgressCB;
public FlowStoppedCB flowStoppedCB;
public HopperEmptyCB hopperEmptyCB;
public IdleCB idleCB;
public MachineDeadCB machineDeadCB;
public PoweredDownCB poweredDownCB;
public PoweredUpCB poweredUpCB;
public PoweringUpCB poweringUpCB;
public ReadyingCB readyingCB;
public ReadyToProcessCB readyToProcessCB;
public StateExceptionCB stateExceptionCB;
public WarningCB warningCB;
public NvmReadCompleteCB nvmReadCompleteCB;
public MakeReadyToFlowCompleteCB makeReadyToFlowCompleteCB;
}
C ++ Код:
typedef struct {
unsigned int size;
ConnectedCB connectedCB;
DisconnectedCB disconnectedCB;
DocCompleteCB docCompleteCB;
DocImageCompleteCB docImageComplete;
DocImageSnippetCompleteCB docImageSnippetCompleteCB;
DocReadCompleteCB docReadComplete;
ExceptionCompleteCB exceptionCompleteCB;
ExceptionInProgressCB exceptionInProgressCB;
FlowStoppedCB flowStoppedCB;
HopperEmptyCB hopperEmptyCB;
IdleCB idleCB;
MachineDeadCB machineDeadCB;
PoweredDownCB poweredDownCB;
PoweredUpCB poweredUpCB;
PoweringUpCB poweringUpCB;
ReadyingCB readyingCB;
ReadyToProcessCB readyToProcessCB;
StateExceptionCB stateExceptionCB;
WarningCB warningCB;
NvmReadCompleteCB nvmReadCompleteCB;
MakeReadyToFlowCompleteCB makeReadyToFlowCompleteCB;
}
unsigned long DPSetCallBacks(DPHandle hdl, DPcbs *dpcbs);
Я использую это так:
DPcbs cbs = new DPcbs();
cbs.poweredUpCB = PoweredUp;
ptr = Marshal.AllocHGlobal(Marshal.SizeOf(cbs));
try
{
// Copy the struct to unmanaged memory.
Marshal.StructureToPtr(cbs, ptr, false);
DPSetCallBacks(handle, ptr);
}
finally
{
// Free the unmanaged memory.
Marshal.FreeHGlobal(ptr);
}
Результатом является сбой приложения без видимых ошибок. Любая помощь будет оценена. Заранее спасибо!