Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#到C+的互操作发送字符串+; 我想把C++中的字符串发送到本地C++ DLL中的函数。_C#_C++_String_Interop - Fatal编程技术网

从C#到C+的互操作发送字符串+; 我想把C++中的字符串发送到本地C++ DLL中的函数。

从C#到C+的互操作发送字符串+; 我想把C++中的字符串发送到本地C++ DLL中的函数。,c#,c++,string,interop,C#,C++,String,Interop,这是我的密码: C侧: C++侧: void func1(char *path) { //... } 我在C++端得到的是一个空字符串,无论我发送什么。 帮忙 谢谢。看起来您有两个问题。第一种是您的本机C++使用ANSI字符串,但您指定Unicode。其次,最简单的方法是将字符串封送为字符串 尝试将DllImport更改为以下内容 [DllImport( @"Native3DHandler.dll", EntryPoint = "#22", CharSet = Ch

这是我的密码: C侧:

C++侧:

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

我在C++端得到的是一个空字符串,无论我发送什么。 帮忙


谢谢。

看起来您有两个问题。第一种是您的本机C++使用ANSI字符串,但您指定Unicode。其次,最简单的方法是将字符串封送为字符串

尝试将DllImport更改为以下内容

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

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

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

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

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

字符串的默认封送处理

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

C侧:

C++方面:

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

阿尔多,为了更准确地传递参数定义,可以使用[ MarshalAs(unMaundType,LPSRT)]等。参见MSDN,您是否更确定C++中字符串是空的?
extern "C" __declspec(dllexport) void getString(char* str, int bufferSize)
{
  strcpy_s(str, bufferSize, "FOOBAR");
}