2009-10-21 38 views
2

我有一個C一個導出函數++ DLL在一個C#應用程序,BYTE * P

// C++ DLL (Blarggg.dll) 

extern "C" 
{ 
    USHORT ReadProperty(BYTE * messsage, USHORT length, BYTE * invokeID) 
    { 
     if(invokeID != NULL) { 
      * invokeID = 10 ; 
     } 
     return 0; 
    } 
} 

,我想將其提供給我的C#應用​​程序的DllImport一個C++ DLL

// C# app 
[DllImport("Blarggg.dll")] 
public static extern System.UInt16 ReadProperty(
     /* [OUT] */ System.Byte[] message, 
     /* [IN] */ System.UInt16 length, 
     /* [OUT] */ System.Byte[] invokeID); 


private void DoIt() 
{ 
    System.Byte[] message = new System.Byte[2000]; 
    System.Byte[] InvokeID = new System.Byte[1]; 
    System.UInt16 ret = ReadProperty(message, 2000, InvokeID); // Error 
} 

問題是我不斷收到以下錯誤消息。

類型「System.NullReferenceException」的unhanded異常出現在Blarggg.dll 其他信息:對象沒有設置爲一個對象的一個​​實例。

我使用VS2008來構建DLL和C#應用程序。

我不是C#程序員。

我在做什麼錯?

回答

2

我直接粘貼你的代碼VS2008它在我的32位機器上完美運行(添加了一個.def文件來設置導出的名稱)。 你的C++庫絕對是一個純粹的win32項目嗎?您給出的錯誤消息似乎暗示它會拋出CLR異常。

+0

我將當前項目中的代碼複製到一個新項目中,並且能夠編譯並運行任何問題。它必須與我的應用程序或另一部分應用程序有關。 謝謝。 – 2009-10-21 23:35:54

0

你可以用C++類型來做到這一點嗎?

我的印象是,你只能DLLImport C DLL。

我們使用的DllImport使用C++ DLL的就好了,但是我們宣佈我們的外部函數

extern "C" __declspec(dllexport) ... 

看一看這個網頁:

http://dotnetperls.com/dllimport-interop

+0

我應該提到,(BYTE =無符號字符,USHORT =無符號短)兩者都是C數據類型。 – 2009-10-21 22:19:48

+0

我將extern「C」添加到問題中,它是在我的原始代碼中,但它對此問題有幫助。 – 2009-10-21 22:22:43

+0

你絕對可以DLLImport C++ dll的,'extern C'僅僅是爲了避免名字混亂,你可以用另一種方式完成同樣的事情。 – 2009-10-21 22:28:05

2

嘗試這種情況:

[DllImport("Blarggg.dll", CallingConvention := CallingConvention.Cdecl)] 
public static extern System.UInt16 ReadProperty( 
     /* [IN] */ System.Byte[] message, 
     /* [IN] */ System.UInt16 length, 
     /* [OUT] */ out System.Byte invokeID); 


private void DoIt() 
{ 
    System.Byte[] message = new System.Byte[2000]; 
    System.Byte InvokeID; 
    System.UInt16 ret = ReadProperty(message, 2000, out InvokeID); 
} 
相關問題