我google了很多&在我的情况下没有任何工作。这是我的代码。
的.cpp
char* pp = "this_is_text";
DLL_EXPORT void ToString_Internal(MicroObject* a_microObj, char* a_str)
{
*a_str = *pp;
}
#define DLL_EXPORT __declspec(dllexport)
C#(导入)
[DllImport("Serializer", CharSet = CharSet.Ansi)]
private extern static void ToString_Internal(IntPtr a_ptr, StringBuilder a_builder);
C#(用法)
StringBuilder l_builder = new StringBuilder(1000); //set 1000 len, for testing
ToString_Internal (m_ptr, l_builder); //invoke to DLL function
Console.WriteLine (l_builder.ToString ()); //print to console
问题#1:Console.WriteLine()仅打印终端中的第一个字母(" t")。这是什么问题?
问题2:我在C#中分配内存(使用StringBuilder)。在我的情况下C#GC是否释放内存,或者我必须手动释放内存以及在哪一侧(C或C#)。
如果你需要更多信息,请告诉我。
答案 0 :(得分:3)
Console.WriteLine()
仅打印终端中的第一个字母(" t")。这是什么问题?
您只在此处复制了一个字符:
*a_str = *pp;
相反,您需要复制整个字符串:
strcpy(a_str, pp);
当然,您只是要求使用此代码发生缓冲区溢出错误。调用函数时,还需要传递缓冲区的长度,并安排不要复制到缓冲区的末尾。
我在C#中分配内存(使用StringBuilder)。在我的情况下C#GC是否释放内存,或者我必须手动释放内存以及在哪一侧(C或C#)。
传递给C ++代码的内存由p / invoke框架管理,它确保正确分配和释放它。你不需要再做任何事了。
根据您提供的代码,该函数似乎使用__cdecl
调用约定。将CallingConvention = CallingConvention.Cdecl
添加到您的DllImport
属性:
[DllImport("Serializer", CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl)]