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

我想从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 ++方面得到的都是一个空字符串。 救命?

谢谢。

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

尝试将DllImport更改为以下内容

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

在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"); } 

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

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

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

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