C编写的DLL库被C#调用的问题

mickey736 2014-12-07 09:50:15
各位大侠:
本人最近在做一个项目,用C生成了一个dll库,函数的内容我大致说一下,因为内容很多,我就不贴出具体代码了。
函数格式:
long test(char *input,int srcLen,char *output,int *desLen)
功能就是 输入input和长度srcLen。输出经过加密的output及加密后的字符串长度。
加密成功函数返回0,失败返回1.

我生成的DLL库在VC中验证是正确的。
但是在C#里调用这个dll库:
[DllImport("NewAESDLL.dll", CallingConvention = CallingConvention.StdCall)]
internal static extern long test(string input, int inlen, ref StringBuilder output, ref int outlen);
执行后,打印output、outlen均不正确。

不知道是 我的函数实现的不对,还是我的DLL调用有什么问题。所以我把函数改了下,把返回结果写死:
long test(char *input,int srcLen,char *output,int *desLen)
{
.......//功能省略;
strcpy(output,"ABCDE");
*desLen =5;
return 0;
}

这样调用C#里直接报内存错误了。

该怎么办呢?
...全文
180 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2014-12-08
  • 打赏
  • 举报
回复
报内存错误,应该是调用和定义没匹配上 确认下dll的CallingConvention 到底是什么 CallingConvention.StdCall 还是Cdecl
mickey736 2014-12-08
  • 打赏
  • 举报
回复
解决了,把CallingConvention改成Cdecl,把函数声明为int型的就好了
mickey736 2014-12-08
  • 打赏
  • 举报
回复
多谢各位,我白天上班在办公室没法上网,现在才看到。 这个DLL库是要提供给别的公司调用的,我是加密了之后再进行BASE64编码的,所以出参为char* 是可以的。
Saleayas 2014-12-08
  • 打赏
  • 举报
回复
StringBuilder 需要预先分配空间。返回的 int *, 处理需要使用 ref 之外,可能还需要 Out 特性。 输入的 input 最好为 char const *, C# 的字符集需要指定为 多字节的。 想这类函数,最好使用 unsigned char,而不要使用字符串。加密的数据可能字符串不能保存,因为加密后,可能存在中间的 0 . C# 端使用 byte[].
robertbo 2014-12-08
  • 打赏
  • 举报
回复
要在前面增加函数声明,在接口函数前面增加extern "C" __declspec(dllexport) 比如 extern "C" __declspec(dllexport) long test(char *input,int srcLen,char *output,int *desLen)
瑞卡哥哥 2014-12-07
  • 打赏
  • 举报
回复
C 中的传出参数在C#中使用StringBuilder。 C#中的字符串有不可变性,C#会将字符串放入字符串拘留池,每次改变字符串,相当于在C中改变了指针的指向。字符串拘留池是受保护的内存,理论上应该是常量。不能被修改。使用stringbuilder是动态分配内存,相当于C中的malloc realloc 的组合。

_declspec(dllexport)
int getss(char * s)
{
	strcpy(s, "ABC");
	return strlen(s);
}



 [DllImport("CC.dll", EntryPoint = "getss", CallingConvention = CallingConvention.Cdecl)]
        public static extern int getss( StringBuilder s);
        static void Main(string[] args)
        {
            StringBuilder s = new StringBuilder();
            s.Append("");
            //Console.WriteLine(getii(10));
            Console.WriteLine("{0}长度",getss(s));
            Console.WriteLine(s);
            Console.ReadKey();
        }

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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