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,并为要接收的内容分配足够的缓冲区空间。
字符串的默认Marshaling http://msdn.microsoft.com/en-us/library/s9ts558h.aspx