C语言的动态库在C#中如何声明及调用

抱朴守拙 2013-07-18 02:38:00
C的函数声明:
int __declspec(dllexport) __cdecl des_encrypt(unsigned char * des_key, unsigned char * des_data, int des_len, unsigned char * des_result);

用WIN8下VS2010开发WinForm程序,项目目标平台为x86,动态库声明如下:
[DllImport("des.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern int des_encrypt(ref string des_key, ref string des_data, int des_len, ref string des_result);

调用:
string key = "12345678";
string mingw = textBox1.Text;
string miw = "";
int i = BankPayPublic.des_encrypt(ref key, ref mingw, mingw.Length, ref miw);

前几次运行时报“System.ExecutionEngineException”的异常,调试几次后现在每次都是“vshost32-clr2.exe停止工作”,急求解决方案,多谢!
...全文
492 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
抱朴守拙 2013-07-19
  • 打赏
  • 举报
回复
引用 13 楼 hudsonhuang 的回复:
[quote=引用 12 楼 zzllabc 的回复:] [quote=引用 11 楼 luodayoudianzi 的回复:] 我C++ 传出的是char* 本来对应的是string 如果用 [DllImport("CoderDLL.dll")] public static extern string encodes(string des);就报和你一样的问题所以你试试我的处理方法
非常感谢,一会儿试一下。[/quote] 我其实不想说的 这种使用有点类似于脱裤放屁。。。 [/quote] 怎么讲?
抱朴守拙 2013-07-19
  • 打赏
  • 举报
回复
搞定,还是参数类型出了问题,用下面的定义就可以了: public static extern int des_encrypt([MarshalAs(UnmanagedType.LPArray)] byte[] des_key, [MarshalAs(UnmanagedType.LPArray)] byte[] des_data, int des_len, [MarshalAs(UnmanagedType.LPArray)] byte[] des_result); 感谢大家的帮助,尤其是luodayoudianzi兄。
hudsonhuang 2013-07-18
  • 打赏
  • 举报
回复
引用 12 楼 zzllabc 的回复:
[quote=引用 11 楼 luodayoudianzi 的回复:] 我C++ 传出的是char* 本来对应的是string 如果用 [DllImport("CoderDLL.dll")] public static extern string encodes(string des);就报和你一样的问题所以你试试我的处理方法
非常感谢,一会儿试一下。[/quote] 我其实不想说的 这种使用有点类似于脱裤放屁。。。
抱朴守拙 2013-07-18
  • 打赏
  • 举报
回复
再顶起来,盼回复
抱朴守拙 2013-07-18
  • 打赏
  • 举报
回复
c的参数是unsigned char *,对应的c#类型用string是不是可以,怎么看哪个是传入参数还是传出参数?
宝_爸 2013-07-18
  • 打赏
  • 举报
回复
传入参数用string.传出参数用ref string或者stringbuilder.
蒋晟 2013-07-18
  • 打赏
  • 举报
回复
[DllImport("<Unknown>", EntryPoint="des_encrypt", CallingConvention=System.Runtime.InteropServices.CallingConvention.Cdecl)] public static extern int des_encrypt([In][MarshalAs(UnmanagedType.LPStr)] string des_key, In][MarshalAs(UnmanagedType.LPStr)] string des_data, int des_len, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder des_result) ;
抱朴守拙 2013-07-18
  • 打赏
  • 举报
回复
自己顶起来,等回复。
抱朴守拙 2013-07-18
  • 打赏
  • 举报
回复
引用 11 楼 luodayoudianzi 的回复:
我C++ 传出的是char* 本来对应的是string 如果用 [DllImport("CoderDLL.dll")] public static extern string encodes(string des);就报和你一样的问题所以你试试我的处理方法
非常感谢,一会儿试一下。
华为黑名单 2013-07-18
  • 打赏
  • 举报
回复
我C++ 传出的是char* 本来对应的是string 如果用 [DllImport("CoderDLL.dll")] public static extern string encodes(string des);就报和你一样的问题所以你试试我的处理方法
抱朴守拙 2013-07-18
  • 打赏
  • 举报
回复
引用 8 楼 hudsonhuang 的回复:
[quote=引用 5 楼 zzllabc 的回复:] c的参数是unsigned char *,对应的c#类型用string是不是可以,怎么看哪个是传入参数还是传出参数?
楼上不是有人说了么?output的字符串只能用stringbuild,就这个简单的函数来看,最后一个是output的。。这个是多基础啊。。。而且加密的东西为什么要调用c/c++呢,C#一抓一大把[/quote] 多谢指教,这几个参数都是unsigned char *类型的,看来都是靠经验来确定输入输出了,这个是银行提供的函数,所以不能用自己的算法。
华为黑名单 2013-07-18
  • 打赏
  • 举报
回复
首先看你这个错误 “System.ExecutionEngineException” 就是对应的类型不正确。 c/c++ 有个很麻烦的问题对传入传出的参数需要特殊处理。我这有个C++ 加密的例子C# 调用希望对你有说帮助! C++ #ifdef __cplusplus #define DLL_EXPORT extern "C" __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllexport) #endif DLL_EXPORT char* _stdcall encodes(const char *src) ; c# 调用 [DllImport("CoderDLL.dll")] public static extern IntPtr encodes(string des); string ret = "武汉理工大学"; string retValue = ""; IntPtr ptr = CPPDLL.encodes(ret); retValue = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr);
hudsonhuang 2013-07-18
  • 打赏
  • 举报
回复
引用 5 楼 zzllabc 的回复:
c的参数是unsigned char *,对应的c#类型用string是不是可以,怎么看哪个是传入参数还是传出参数?
楼上不是有人说了么?output的字符串只能用stringbuild,就这个简单的函数来看,最后一个是output的。。这个是多基础啊。。。而且加密的东西为什么要调用c/c++呢,C#一抓一大把
抱朴守拙 2013-07-18
  • 打赏
  • 举报
回复
再顶起来,盼回复
抱朴守拙 2013-07-18
  • 打赏
  • 举报
回复
补充:也请各位看一下在C#中的声明及调用是否正确。

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧