2010-10-11 70 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