将字符串从C ++传递到C#不起作用

时间:2016-03-30 06:47:00

标签: c# c++ string marshalling dllimport

我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#)。

如果你需要更多信息,请告诉我。

1 个答案:

答案 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)]
相关问题