2010-10-11 72 views
2

因此,在Visual Studio中,我有兩個項目的解決方案,第一個是託管C++代碼,第二個是非託管C++庫(waffles)。我想在託管代碼中使用庫中的類。使用非託管庫

如果我簡單地添加'include'GMacros.h'',那麼我得到'無法編譯/ clr'錯誤。試圖包裝在#pragma unmanaged /託管,但它似乎並沒有工作。

有什麼我可以做,而無需編輯外部庫代碼或編寫任何包裝?

回答

1

無法在託管.NET中直接調用非託管代碼。您需要添加__declspec(dllexport)到你的函數的聲明應該是在非託管庫外可見:

public: 
    void __declspec(dllexport) MyUnmanagedMethod(); 

,然後在託管代碼編寫一個簡單的包裝是這樣的:

public ref class Wrapper 
{ 
public: 
    [DllImport("MyUnmanagedLibrary.dll")] 
    static extern void MyUnmanagedMethod(); 
} 

現在你可以調用Wrapper.MyUnmanagedMethod與來自您的託管代碼的任何其他靜態方法一樣。

+0

如果我沒有.dll文件?只有一堆.h和.cpp – spacevillain 2010-10-11 19:57:33

+0

.dll文件是由編譯器在生成非託管項目時創建的。在Debug或Release目錄中查找 – NOtherDev 2010-10-11 20:04:49

1

通用的解決方案是將庫調用包裝在可包含在託管代碼中的頭文件的薄包裝函數/類中。不是很漂亮,但會讓你到那裏。

0

P /使用DLLImport屬性調用也需要你調低CLR類型的函數參數(如果有的話)。因此,例如一個DWORD成爲intIN HANDLE可以成爲一個IntPtrLPDWORD成爲out intLPVOID通常可以編組爲byte[] ...等等。看到一個體面的總結關於它here

一個例子拿出我最近的項目中,我曾與一個老數字輸出盒一個DLL接口的:

//This function's header in the DLL was: 
//BOOL _stdcall fnPerformaxComSendRecv(IN HANDLE pHandle, IN LPVOID wBuffer, IN DWORD dwNumBytesToWrite, IN DWORD dwNumBytesToRead, OUT LPVOID rBuffer); 
[DllImport("PerformaxCom.dll", SetLastError = true, CharSet = CharSet.Auto)] 
private static extern bool fnPerformaxComSendRecv(IntPtr pHandle, byte[] wBuffer, int dwNumBytesToWrite, int dwNumBytesToRead, byte[] rBuffer); 
+0

如何將複雜類型對象傳遞給P/Invoke方法? – 2013-08-17 22:13:23