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