所以在visual studio中我有两个项目的解决方案,第一个是托管c ++代码,第二个是非托管c ++库(waffles)。我想在托管代码中使用库中的类。
如果我只是添加'include'GMacros.h“',那么我得到'无法用/ clr编译'错误。试图在#pragma unmanaged / managed中包含include,但它似乎没有用。
如果不编辑外部库代码或编写任何包装器,我能做些什么吗?
答案 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)
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);