C# 调用 c++ dll 的一些问题总结
2009-12-24 15:09
791 查看
1.c++的到处函数只要在函数申明的时候加个导出关键字就可以了
2.参数类型问题,
一般的c++中char * 对应 c#中的string
而c++中 char **类型的参数对应c#中 ref string 这种一般都是用来返回字符串的!
3.函数入口问题,一般会出现 "找不到入口点" 这个问题不是由你引起的,而是系统自己把名字改了,改成什么样的名字建议你用eXeScope 打开dll看看里面的全称,比如我从网上下载的一个dll的导出方法列表
比如我要用 RSAES_PKCS_EncryptString这个方法,但是已经不能这么用了
应该改成下面的方法
2.参数类型问题,
一般的c++中char * 对应 c#中的string
而c++中 char **类型的参数对应c#中 ref string 这种一般都是用来返回字符串的!
3.函数入口问题,一般会出现 "找不到入口点" 这个问题不是由你引起的,而是系统自己把名字改了,改成什么样的名字建议你用eXeScope 打开dll看看里面的全称,比如我从网上下载的一个dll的导出方法列表
导出, CryptoPP32.dll 序列 地址 名字 00000001 100489D0 ?Base64DecodeFile@CryptoPP32@@YA_NPBD0@Z 00000002 1004FAC0 ?Base64DecodeString@CryptoPP32@@YA_NPBDPAPAD@Z 00000003 100488E0 ?Base64EncodeFile@CryptoPP32@@YA_NPBD0@Z 00000004 1004F960 ?Base64EncodeString@CryptoPP32@@YA_NPBDPAPAD@Z 00000005 10045EB0 ?FreeString@CryptoPP32@@YAXPAD@Z 00000006 10048800 ?GunzipFile@CryptoPP32@@YA_NPBD0@Z 00000007 10048720 ?GzipFile@CryptoPP32@@YA_NPBD0H@Z 00000008 10048E30 ?HMAC_SHA1_DecryptFile@CryptoPP32@@YA_NPBD00@Z 00000009 10048B90 ?HMAC_SHA1_DecryptString@CryptoPP32@@YA_NPBD0PAPAD@Z 0000000A 10048D40 ?HMAC_SHA1_EncryptFile@CryptoPP32@@YA_NPBD00@Z 0000000B 1004B540 ?HMAC_SHA1_EncryptString@CryptoPP32@@YA_NPBD0PAPAD@Z 0000000C 10048AB0 ?HexDecodeFile@CryptoPP32@@YA_NPBD0@Z 0000000D 1004FE10 ?HexDecodeString@CryptoPP32@@YA_NPBDPAPAD@Z 0000000E 1004B3D0 ?HexEncodeFile@CryptoPP32@@YA_NPBD0@Z 0000000F 1004FC20 ?HexEncodeString@CryptoPP32@@YA_NPBDPAPAD@Z 00000010 1004C260 ?RSAES_OAEP_DecryptString2@CryptoPP32@@YA_NPBD0PAPAD@Z 00000011 1004CD60 ?RSAES_OAEP_DecryptString@CryptoPP32@@YA_NPBD00000000PAPAD@Z 00000012 1004C4C0 ?RSAES_OAEP_DecryptString@CryptoPP32@@YA_NPBD0PAPAD@Z 00000013 1004B780 ?RSAES_OAEP_EncryptString2@CryptoPP32@@YA_NPBD0PAPAD0@Z 00000014 1004C790 ?RSAES_OAEP_EncryptString@CryptoPP32@@YA_NPBD00PAPAD0@Z 00000015 1004BCF0 ?RSAES_OAEP_EncryptString@CryptoPP32@@YA_NPBD0PAPAD0@Z 00000016 10049220 ?RSAES_OAEP_GenKeyFiles@CryptoPP32@@YA_NPBD0I0@Z 00000017 100498E0 ?RSAES_OAEP_GenKeyStrings@CryptoPP32@@YA_NPAPAD0IPBD@Z 00000018 1004DDB0 ?RSAES_PKCS_DecryptString2@CryptoPP32@@YA_NPBD0PAPAD@Z 00000019 1004E870 ?RSAES_PKCS_DecryptString@CryptoPP32@@YA_NPBD00000000PAPAD@Z 0000001A 1004E010 ?RSAES_PKCS_DecryptString@CryptoPP32@@YA_NPBD0PAPAD@Z 0000001B 1004D2D0 ?RSAES_PKCS_EncryptString2@CryptoPP32@@YA_NPBD0PAPAD0@Z 0000001C 1004E2E0 ?RSAES_PKCS_EncryptString@CryptoPP32@@YA_NPBD00PAPAD0@Z 0000001D 1004D840 ?RSAES_PKCS_EncryptString@CryptoPP32@@YA_NPBD0PAPAD0@Z 0000001E 1004A070 ?RSAES_PKCS_GenKeyFiles@CryptoPP32@@YA_NPBD0I0@Z 0000001F 1004A730 ?RSAES_PKCS_GenKeyStrings@CryptoPP32@@YA_NPAPAD0IPBD@Z 00000020 1004AEC0 ?RSASS_PKCS_SignFile@CryptoPP32@@YA_NPBD000@Z 00000021 1004EDE0 ?RSASS_PKCS_SignString@CryptoPP32@@YA_NPBD0PAPAD0@Z 00000022 100481D0 ?RSASS_PKCS_VerifyFile@CryptoPP32@@YA_NPBD000@Z 00000023 1004F380 ?RSASS_PKCS_VerifyString@CryptoPP32@@YA_NPBD000@Z
比如我要用 RSAES_PKCS_EncryptString这个方法,但是已经不能这么用了
应该改成下面的方法
using System.Runtime.InteropServices; namespace KSN.BLL.Common { public class RSACrypt { /// <summary> /// 获取密钥文件 /// </summary> /// <param name="privFilename">私钥文件路径</param> /// <param name="pubFilename">公文文件路径</param> /// <param name="keyLength">密钥长度</param> /// <param name="seed">随机种子</param> /// <returns></returns> [DllImport("CryptoPP32.dll", EntryPoint = "RSAES_PKCS_GenKeyFiles", CharSet = CharSet.Ansi)] private static extern bool RSAES_PKCS_GenKeyFiles( string privFilename, string pubFilename, int keyLength, string seed); /// <summary> /// 获取字符串形式的密钥 /// </summary> /// <param name="outPrivKey">私钥</param> /// <param name="outPubKey">公钥</param> /// <param name="keyLength">密钥长度</param> /// <param name="seed">随机种子</param> /// <returns></returns> [DllImport("CryptoPP32.dll", EntryPoint = "?RSAES_PKCS_GenKeyStrings@CryptoPP32@@YA_NPAPAD0IPBD@Z", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern bool RSAES_PKCS_GenKeyStrings(ref string outPrivKey, ref string outPubKey, int keyLength, string seed); /// <summary> /// RSA加密字符串 /// </summary> /// <param name="strPubKey">公钥</param> /// <param name="message">被加密信息</param> /// <param name="outCipher">加密后密文</param> /// <param name="seed">随机种子</param> /// <returns></returns> [DllImport("CryptoPP32.dll", EntryPoint = "?RSAES_PKCS_EncryptString@CryptoPP32@@YA_NPBD0PAPAD0@Z", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern bool RSAES_PKCS_EncryptString( string strPubKey, string message, ref string outCipher, string seed); //[DllImport("CryptoPP32.dll")] //private static extern bool RSAES_PKCS_EncryptString( string N, string E, string message, ref string outCipher, string seed); //[DllImport("CryptoPP32.dll")] //private static extern bool RSAES_PKCS_EncryptString2(ref string pubFilename, ref string message, ref string outCipher, string seed); /// <summary> /// RSA解密字符串 /// </summary> /// <param name="strPrivKey">私钥</param> /// <param name="cipher">密文</param> /// <param name="outPlain">解密后的原文</param> /// <returns></returns> [DllImport("CryptoPP32.dll", EntryPoint = "?RSAES_PKCS_DecryptString@CryptoPP32@@YA_NPBD0PAPAD@Z", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern bool RSAES_PKCS_DecryptString( string strPrivKey, string cipher, ref string outPlain); //[DllImport("CryptoPP32.dll")] //private static extern bool RSAES_PKCS_DecryptString( string N, string E, string D, string P, string Q, string dP, string dQ, string U, string cipher, ref string outPlain); //[DllImport("CryptoPP32.dll")] //private static extern bool RSAES_PKCS_DecryptString2( string privFilename, string cipher, ref string outPlain); } }
相关文章推荐
- 在c#里调用C++的dll时,需要注意的一些问题
- C#调用C++dll问题总结
- 在c#里调用C++的dll时,需要注意的一些问题
- C# 调用 C++ dll 的一些问题
- 在C#里调用C++的dll时需要注意的一些问题<转>
- 在c#里调用C++的dll时,需要注意的一些问题
- C# 调用C++ dll问题总结一 ——无法找到dll
- 关于c#调用c++ dll 的一些问题和解决方案
- C#调用C++写的DLL总结
- C# 调用C++ DLL的几点总结
- C#调用dll(C++(Win32))时的类型转换总结
- C/C++调用Delphi制作的dll时发现的一些问题
- C#调用C++ DLL相关问题
- c# 调用c/c++ dll 参数问题
- c#调用c++开发的dll const char* 返回值接收问题
- [C#开发手记] C# 调用C++ dll 注意的问题
- C#调用C++ DLL相关问题
- C#调用C/C++ DLL 参数传递和回调函数的总结
- C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针
- C# 调用C++ SDK/API的问题总结