我想将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 ++端获得一个空字符串。 帮助
感谢。
答案 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)