【问题标题】:Interop sending string from C# to C++互操作将字符串从 C# 发送到 C++
【发布时间】:2010-10-15 13:02:54
【问题描述】:

我想将 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++ 端得到的是一个空字符串。 帮忙?

谢谢。

【问题讨论】:

  • Aldo,为了更准确的传递参数定义,可以使用 [MarshalAs(UnmanagedType.LPStr)] 等。更多信息见 MSDN
  • 您如何确定字符串在 C++ 端为空?

标签: c# c++ string interop


【解决方案1】:

您似乎有 2 个问题。首先是您的本机 C++ 使用 ANSI 字符串,但您指定的是 unicode。其次,将字符串编组为字符串是最简单的。

尝试将 DllImport 更改为以下内容

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2010-10-13
            • 2010-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多