Сбой программы при использовании функции DLLImport - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь использовать функцию из библиотеки 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);
                }

Результатом является сбой приложения без видимых ошибок. Любая помощь будет оценена. Заранее спасибо!

1 Ответ

0 голосов
/ 03 июля 2019

Если вы хотите скомпилировать такой код C ++ в DLL, лучше включить его в класс и предоставить метод доступа.

c # проект никогда не сможет получить доступ к скомпилированной структуре typedef без ее переноса!

Будьте в курсе вашей версии DLL, скомпилированной во время выполнения

...