C/C++函数原型为:
LMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID,
                                        unsigned short usPID,
                                        LPGUID lpGUID,
                                        BOOL *pbDriverInstalled);
LMUSB_HANDLE 定义为 typedef void *LMUSB_HANDLE;
LPGUID 定义为 typedef GUID *LPGUID;
GUID 定义为 typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;
C#中重新声明函数为
[DllImport("LMUSBDLL_TEST.dll")]
public static extern Byte[] InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,
                                                  ref bool  pbDriverInstalled);
public struct GUID
{
    private UInt32  Data1;
    private UInt16 Data2;
    private UInt16 Data3;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    private Byte[] Data4;    public GUID(UInt32 DT1, UInt16 DT2, UInt16 DT3, Byte []DA4)
    {
       this.Data1 = DT1;
       this.Data2 = DT2;
       this.Data3 = DT3;
       this.Data4 = DA4;
    }
}调用如下:
static Byte[] DA4_INITIAL = { 0xB7, 0x72, 0xb3, 0xAF, 0x2B, 0x6F, 0xDE, 0x1C };
static GUID GUID_DEVINTERFACE_STELLARIS_BULK = new GUID(0x6E45736A, 0x2B1B, 0x4078, DA4_INITIAL);Byte []hUSB;
bool bDriverInstalled = false;
hUSB = InitializeDevice(IT300_BULK_VID, IT300_BULK_PID, ref GUID_DEVINTERFACE_STELLARIS_BULK, ref bDriverInstalled);
编译成功,运行出错如下:未经处理的异常:  System.Runtime.InteropServices.MarshalDirectiveException: 无法
封送处理“return value”: 无效的托管/非托管类型组合。
   在 ConsoleApplication_CsharpReUseCppDll_Test.Program.InitializeDevice(UInt16
usVID, UInt16 usPID, GUID& lpGUID, Boolean& pbDriverInstalled)
   在 ConsoleApplication_CsharpReUseCppDll_Test.Program.Main(String[] args) 位置
 E:\IT-300-DXWindowsApplicationRegisted-N1\ConsoleApplication_CsharpReUseCppDll_
Test\Program.cs:行号 165
请按任意键继续. . .
InitializeDevice定义如下:extern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORT
InitializeDevice(unsigned short usVID,
                 unsigned short usPID,
                 LPGUID lpGUID,
                 BOOL *pbDriverInstalled)
{    return(InitializeDeviceByIndex(usVID, usPID, lpGUID, 0, true,
                                   pbDriverInstalled));
}extern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORT
InitializeDeviceByIndex(unsigned short usVID,
                        unsigned short usPID,
                        LPGUID lpGUID,
                        DWORD dwIndex,
                        BOOL bOpenDataEndpoints,
                        BOOL *pbDriverInstalled){
    BOOL bResult;
    WINUSB_INTERFACE_HANDLE usbHandle;
    USB_INTERFACE_DESCRIPTOR ifaceDescriptor;
    WINUSB_PIPE_INFORMATION pipeInfo;
    UCHAR speed;
    ULONG length;
    DWORD dwError;
    int i;
    tDeviceInfoWinUSB *psDevInfo;    if(!lpGUID || !pbDriverInstalled)
    {
        return(NULL);
    }
    psDevInfo = (tDeviceInfoWinUSB *)LocalAlloc(LPTR, sizeof(tDeviceInfoWinUSB));
    if(!psDevInfo)
    {
        return(NULL);
    }
    psDevInfo->deviceHandle = OpenDeviceByIndex(dwIndex, lpGUID);
    if(psDevInfo->deviceHandle == INVALID_HANDLE_VALUE)
    {
        dwError = GetLastError();
        *pbDriverInstalled = (dwError == ERROR_DEV_NOT_EXIST) ? FALSE : TRUE;
        LocalFree((HLOCAL)psDevInfo);
        return(NULL);
    }    bResult = WinUsb_Initialize(psDevInfo->deviceHandle, &usbHandle);
    if(bResult)
    {
        psDevInfo->winUSBHandle = usbHandle;
        length = sizeof(UCHAR);
        bResult = WinUsb_QueryDeviceInformation(psDevInfo->winUSBHandle,
                                                DEVICE_SPEED,
                                                &length,
                                                &speed);
    }    if(bOpenDataEndpoints)
    {        if(bResult)
        {
            psDevInfo->deviceSpeed = speed;
            bResult = WinUsb_QueryInterfaceSettings(psDevInfo->winUSBHandle,
                                                    0,
                                                    &ifaceDescriptor);
        }        if(bResult)
        {
            for(i=0;i<ifaceDescriptor.bNumEndpoints;i++)
            {
                bResult = WinUsb_QueryPipe(psDevInfo->winUSBHandle, 0, (UCHAR) i,
                                          &pipeInfo);                if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&
                      USB_ENDPOINT_DIRECTION_IN(pipeInfo.PipeId))
                {
                    psDevInfo->bulkInPipe = pipeInfo.PipeId;
                }
                else if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&
                      USB_ENDPOINT_DIRECTION_OUT(pipeInfo.PipeId))
                {
                    psDevInfo->bulkOutPipe = pipeInfo.PipeId;
                }
                else
                {
                    SetLastError(ERROR_NOT_SAME_DEVICE);
                    bResult = FALSE;
                    break;
                }
            }
        }        if(bResult)
        {
            psDevInfo->hReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);            if(psDevInfo->hReadEvent)
            {
                bResult = true;
            }
        }
    }
    else
    {
        psDevInfo->bulkOutPipe = 0;
        psDevInfo->bulkInPipe = 0;
        psDevInfo->hReadEvent = NULL;
    }    if(bResult)
    {
        return((LMUSB_HANDLE)psDevInfo);
    }
    else
    {
        LocalFree((HLOCAL)psDevInfo);
        return(NULL);
    }
}求教各路大虾,如何解决“无法封送处理“return value”: 无效的托管/非托管类型组合。”的问题?

解决方案 »

  1.   

    参考,11楼
    http://topic.csdn.net/u/20110422/14/dadce311-e63f-4b83-93a4-4d0cb6a9f014.html
      

  2.   

    未经处理的异常: System.Runtime.InteropServices.MarshalDirectiveException: 无法
    封送处理“return value”: 无效的托管/非托管类型组合。
      在 ConsoleApplication_CsharpReUseCppDll_Test.Program.InitializeDevice(UInt16
    usVID, UInt16 usPID, GUID& lpGUID, Boolean& pbDriverInstalled)
      在 ConsoleApplication_CsharpReUseCppDll_Test.Program.Main(String[] args) 位置
     E:\IT-300-DXWindowsApplicationRegisted-N1\ConsoleApplication_CsharpReUseCppDll_
    Test\Program.cs:行号 165
    请按任意键继续. . 
    为什么??
      

  3.   

    已经找到解决的方法:
    public static extern Byte[] InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,
      ref bool pbDriverInstalled);
    应该是
    public static extern IntPtr InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,
      ref bool pbDriverInstalled);再次感谢大虾们的帮助!