一、调用步骤
1、准备好C++dll库;
2、将dll库放入exe目录下,或放在某个固定的文件目录下;
3、使用.NET的Interop机制引入C++dll到C#程序中,声明接口函数,例:
[DllImport("Kernel32")]
public static extern int WritePrivateProfileString(string Section, string Key, string Value, string FilePath);
[DllImport("C:\\Users\\conglin\\AppData\\Roaming\\ShuxiangTech\\LTShiyiCommon\\cache\\updatedll\\CryptEnDe.dll", EntryPoint = "CFB_AESEncryptStr_BASE64")]
public static extern void CFB_AESEncryptStr_BASE64(string key, string iv, string cipherText, StringBuilder outstr);
[DllImport("C:\\Users\\conglin\\AppData\\Roaming\\ShuxiangTech\\LTShiyiCommon\\cache\\updatedll\\CryptEnDe.dll", EntryPoint = "CFB_AESDecryptStr_BASE64")]
public static extern void CFB_AESDecryptStr_BASE64(string key, string iv, string cipherText, StringBuilder outstr);
其中声明的函数名为dll中的接口名,DllImport中的第一个参数必须为常量。
二、注意事项
1、C++封装的接口必须以全局函数形式封装,否则会出现“无法找到入口点”错误,例如:
#define DLL_API __declspec(dllexport)
extern "C" DLL_API void CFB_AESEncryptStr_BASE64(const char *key,char *iv,const char *plainText,char *coutstr);
2、注意C#与C++之间数据类型的对应关系,比如
DLL 需传入char *类型
[DllImport(“MyDLL.dll")]
//传入值
public static extern int mySum (string astr1,string bstr1);
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(char * astr2,char *bstr2)
{
//改变astr2bstr 2 ,astr1 bstr1不会被改变
return a+b;
}
DLL 需传出char *类型
[DllImport(“MyDLL.dll")]
// 传出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf );
//DLL中申明
extern “C” __declspec(dllexport) int WINAPI mySum(char * astr,char *bstr)
{
//传出char * 改变astr bstr -->abuf, bbuf可以被改变
return a+b;
}
类型对应关系应用可以参考http://blog.csdn.net/hbqhdlc/article/details/6843650。