使用非托管库

时间:2010-10-11 19:40:17

标签: c++ unmanaged managed

所以在visual studio中我有两个项目的解决方案,第一个是托管c ++代码,第二个是非托管c ++库(waffles)。我想在托管代码中使用库中的类。

如果我只是添加'include'GMacros.h“',那么我得到'无法用/ clr编译'错误。试图在#pragma unmanaged / managed中包含include,但它似乎没有用。

如果不编辑外部库代码或编写任何包装器,我能做些什么吗?

3 个答案:

答案 0 :(得分:1)

通用解决方案是将库调用包装在瘦包装函数/类中,这些函数/类的头文件可以包含在托管代码中。不是很漂亮,但会让你到那儿。

答案 1 :(得分:1)

无法在托管.NET中直接调用非托管代码。您需要将__declspec(dllexport)添加到应该在非托管库外部可见的函数声明中:

public:
    void __declspec(dllexport) MyUnmanagedMethod();

然后在您的托管代码中编写一个这样的简单包装器:

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

现在,您可以像管理代码中的任何其他静态方法一样调用Wrapper.MyUnmanagedMethod

答案 2 :(得分:0)

带有DLLImport属性的P / Invoke还要求您将函数参数(如果有的话)编组到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);