从C+获取char*+;DLL到C#应用程序
我在C++ dll中导出函数:从C+获取char*+;DLL到C#应用程序,c#,c++,C#,C++,我在C++ dll中导出函数: extern "C" int _stdcall info(int aError, char * description, int *aLen) 试图从C#应用程序调用它 宣布: [DllImport("mydll.dll", CallingConvention = CallingConvention.StdCall)] public static extern int info(int aError, StringBuilder description, r
extern "C" int _stdcall info(int aError, char * description, int *aLen)
试图从C#应用程序调用它
宣布:
[DllImport("mydll.dll", CallingConvention = CallingConvention.StdCall)] public static extern int info(int aError, StringBuilder description, ref int length);
电话:
StringBuilder buffer = new StringBuilder();
fr = info(5, buffer, ref 256);
从第一个角度看,这似乎是可行的。但它真的安全吗?我的意思是StringBuilder
是否会始终为从info
到buffer
变量的字符串管理足够的内存
我在声明中写入StringBuilder说明
,是否应添加ref
我的意思是,StringBuilder是否会始终为从info到buffer变量的字符串管理足够的内存
您应始终使用获取容量的构造函数指定StringBuilder的初始容量:
int size = 256;
StringBuilder buffer = new StringBuilder(256);
fr = info(5, buffer, ref size);
但我没有通过考试,也没有问题。为什么?@vico字符串生成器有一个初始容量(我不知道确切的容量),因此缓冲区可能已经足够大了。在声明中,我写了“StringBuilder描述”,我是否应该添加“ref”否,StringBuilder已经是一个引用类型,默认情况下被封送为[in,Out]。使用ref将意味着本机类型是
char**
@OguzOzgul I通过ref固定了常量,就像这样只是为了说明。StringBuilder的“自动调整大小”在用于平台调用时并不重要——内部缓冲区必须足够大,以满足本机被调用方的期望。