C#调用C/C++DLL的两种方法
前言
工作中,需要给客户提供公司产品的.NET动态库,但驱动工程师往往只提供C编译的库,这里就需要我做一些中间工作,方便客户使用我们的产品。
方法1:常用的DLLImport方法
一般这种方法用于调用非托管动态库,很常见,这里我就不做赘述,推荐一个好用的网站方便大家做参考, 链接: pinvoke.net。
方法2:CLR封装法
通过Visual studio新建一个支持CLR的DLL项目,项目调用原来c编译的库的Lib文件,然后重新封装一层方法写在这个项目里面。
下面举例创建一个CLRCom项目,关键代码如下:
引用Lib的头文件.h,这里是gxcom_lib.h
#pragma comment(lib, "gxcom.lib")
#ifndef DLL
#define DLL __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
//这是原来c编译dll中的方法,调用声明,例如
DLL DWORD __stdcall GetSN(HANDLE hCom);
CLRCOM.h
#pragma once
using namespace System;
namespace clrCOM
{
public ref class CLRCOM
{
public:
CLRCOM();
~CLRCOM();
DWORD CLR_GetSN(IntPtr ptr);//自定义方法
};
}
CLRCOM.cpp
#include "gxcom_lib.h"
#include "CLRCOM.h"
namespace clrCOM
{
CLRCOM::CLRCOM()
{
}
CLRCOM::~CLRCOM()
{
}
DWORD CLRCOM::CLR_GetSN(IntPtr ptr)//封装实现
{
HANDLE hDev=(IntPtr)ptr;
return GetSN(hDev);//调用了原方法
}
}
注意,.NET项目可以直接引用此项目生成的DLL(我这里是clrCOM.dll),但也要将原来C编译的DLL(我这里是gxcom.dll)拷过去,因为它是依赖文件,不然会报错“System.IO.FileNotFoundException”。