Q
使用非託管庫
2
A
回答
1
無法在託管.NET中直接調用非託管代碼。您需要添加__declspec(dllexport)
到你的函數的聲明應該是在非託管庫外可見:
public:
void __declspec(dllexport) MyUnmanagedMethod();
,然後在託管代碼編寫一個簡單的包裝是這樣的:
public ref class Wrapper
{
public:
[DllImport("MyUnmanagedLibrary.dll")]
static extern void MyUnmanagedMethod();
}
現在你可以調用Wrapper.MyUnmanagedMethod
與來自您的託管代碼的任何其他靜態方法一樣。
1
通用的解決方案是將庫調用包裝在可包含在託管代碼中的頭文件的薄包裝函數/類中。不是很漂亮,但會讓你到那裏。
0
P /使用DLLImport屬性調用也需要你調低CLR類型的函數參數(如果有的話)。因此,例如一個DWORD
成爲int
,IN HANDLE
可以成爲一個IntPtr
,LPDWORD
成爲out int
,LPVOID
通常可以編組爲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
相關問題
- 1. C++託管和非託管靜態庫
- 2. 託管vs非託管
- 3. DirectX託管或非託管?
- 4. 如何通過引用非託管庫傳遞託管數組?
- 5. 將非託管/非託管成員添加到託管類
- 6. 在非託管庫方法中使用託管C++中的指針
- 7. 託管可執行文件中的非託管庫導致託管異常
- 8. 動態鏈接託管的C++類庫中的非託管dll
- 9. 鏈接錯誤 - >託管DLL到非託管庫
- 10. 使用託管代碼中的非託管代碼
- 11. 在非託管中使用託管類對象
- 12. 如何使用託管代碼從非託管代碼?
- 13. 使用非託管DLL託管WCF服務
- 14. 在非託管C++ dll中使用託管c#dll
- 15. 爲非託管使用包裝託管代碼
- 16. 將非託管結構變爲使用c託管代碼#
- 17. 使用BeginInvoke調用非託管代理
- 18. Gdiplus在C++託管或非託管?
- 19. C++託管到非託管轉換
- 20. 非託管結構實例在託管
- 21. 託管代碼在非託管
- 22. 非託管內存和託管存儲
- 23. 託管代碼與非託管代碼
- 24. 從非託管C++配置.NET庫
- 25. 非託管調用堆棧
- 26. 使用VS2010的非託管Windows服務
- 27. 使用非託管代碼.net
- 28. 使用非託管DLL訪問衝突
- 29. 使用64位的非託管回調
- 30. 在非託管靜態庫中使用Windows窗體和VC++
如果我沒有.dll文件?只有一堆.h和.cpp – spacevillain 2010-10-11 19:57:33
.dll文件是由編譯器在生成非託管項目時創建的。在Debug或Release目錄中查找 – NOtherDev 2010-10-11 20:04:49