将字符串引用从C#传递给C ++函数

时间:2014-06-18 08:06:05

标签: c# c++ mfc

我有一个C ++库,我在其中编写了一些函数 此函数必须返回一个整数和一个字符串。 (2输出)我将从我的C#程序中调用此函数 这是我在C ++中的代码:

extern "C"{

    __declspec(dllexport)   UINT Read(OUT char* Temp )
    {
    .....
    }  
}  

这是ImportDll课程中的C#代码:

[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read(char[] temp);  

以我的形式,我有这个:

char[] str = new char[256];  
ImportDLL.Read(str);  

它正确返回一个Int但字符串结果(str数组)完全为零(\ 0)!
我的代码有什么问题?
谢谢。

2 个答案:

答案 0 :(得分:2)

Matthew Watson的答案之一:您还需要将stringbuilder参数封送到LPSTR(char *),例如

[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read([MarshalAs(UnmanagedType.LPStr)] StringBuilder temp);

答案 1 :(得分:1)

由于返回的值是OUT,我假设它是由C ++方法创建的。

在这种情况下,您可能需要将StringBuilder传递给它:

[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
public static extern uint Read(StringBuilder temp);  

请注意,您还应该指定charset,这取决于C ++代码使用的字符编码 - ANSI或Unicode。

要调用它,请创建一个足够大的新StringBuilder并将其传递给Read(),然后使用StringBuilder.ToString()在Read()返回后检索字符串。

如果C ++函数需要一定大小的字符串缓冲区,则需要将StringBuilder创建为至少为该大小,例如:

const int BUFFER_SIZE = 128;
var sb = new StringBuilder(BUFFER_SIZE);
Read(sb);
var result = sb.ToString();

注意:如果不了解C ++函数的详细信息,很难说这是否真的是正确的解决方案。可能你需要传递一个字符串。