Interop从C#发送字符串到C ++

时间:2009-03-25 19:10:26

标签: c# c++ string interop

我想将C#中的字符串发送到本机C ++ DLL中的函数。

这是我的代码: C#方:

[DllImport(@"Native3DHandler.dll", EntryPoint = "#22", 
    CharSet = CharSet.Unicode)]
private static extern void func1(byte[] path);

public void func2(string path)
{
   ASCIIEncoding encoding = new ASCIIEncoding();
   byte[] arr = encoding.GetBytes(path);
   func1(this.something, arr);
}

C ++方面:

void func1(char *path)
{
    //...
}

无论发送什么,我每次都会在C ++端获得一个空字符串。 帮助

感谢。

5 个答案:

答案 0 :(得分:2)

看起来你有2个问题。第一个是您的本机C ++使用ANSI字符串,但您指定unicode。其次,将字符串编组为字符串是最简单的。

尝试将DllImport更改为以下

[DllImport(
  @"Native3DHandler.dll", 
  EntryPoint = "#22",  
  CharSet = CharSet.Ansi)]
private static extern void func1(void* something, [In] string path);

答案 1 :(得分:2)

在VS2008中没有额外的编组说明,对我来说很好用:

C#方:

[DllImport("Test.dll")]
public static extern void getString(StringBuilder theString, int bufferSize);

func()
{
  StringBuilder tstStr = new StringBuilder(BufSize);
  getString(tstStr, BufSize);
}

C ++方面:

extern "C" __declspec(dllexport) void getString(char* str, int bufferSize)
{
  strcpy_s(str, bufferSize, "FOOBAR");
}

答案 2 :(得分:0)

您的声明是错误的。参数应为string类型,您应该将字符集编码设置为Ansi,如下所示:

[DllImport(@"Native3DHandler.dll", EntryPoint = "#22", 
    CharSet = CharSet.Ansi)]
private static extern void func1(string path);

这假设您没有修改C ++代码中路径变量的内容。然后,直接传递字符串参数(不需要包装器)。

答案 3 :(得分:0)

如果您只想发送字符串,只需将func1的参数声明为字符串即可。如果要接收字符串,请将其声明为StringBuilder,并为要接收的内容分配足够的缓冲区空间。

答案 4 :(得分:0)