【问题标题】:equivalent char* in C#C# 中的等效 char*
【发布时间】:2009-09-20 10:32:27
【问题描述】:

我有一个用 c++ 编写的 dll。我正在 p/invoking 调用函数。

我有这个 c++ 声明。

int dll_registerAccount(char* username, char* password);

我已经完成了这个 dllimport 声明:

[DllImport("pjsipDlld")]
static extern int dll_registerAccount(IntPtr username, IntPtr password);

我的 DllImport 会等同于使用 IntPtr 的 c++ 吗?

非常感谢您的建议,

【问题讨论】:

标签: c# pinvoke marshalling


【解决方案1】:

执行此操作的 C# 方法是让封送处理程序在处理字符串时处理 char* 内容:

[DllImport("pjsipDlld")]
static extern int dll_registerAccount(
    [MarshalAs(UnmanagedType.LPStr)]string username,
    [MarshalAs(UnmanagedType.LPStr)]string password);

如果您使用的是宽字符,请将 LPStr 替换为 LPWStr

【讨论】:

    【解决方案2】:

    注意调用约定,这让我很头疼。在我的情况下,我需要调用一个 C++ DLL,但使用 C 风格的导出,它使用 cdecl 调用约定。如果您有幸拥有源 Visual Studio 解决方案,请转到属性 -> C/C++ -> 高级并在“调用约定”下找到它。这为我解决了这个问题:

    [DllImport(DllName, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    // bool MyFunction(char* fileName) <-- From the DLL
    static extern bool MyFunction(string fileName);
    

    【讨论】:

      【解决方案3】:
      [DllImport("DLL loction"), EntryPoint = "dll_registerAccount",
          CallingConvention = CallingConvention.Cdecl)]
      [return : MarshalAs(UnmanagedType.I4)]
      static extern int dll_registerAccount(
          [MarshalAs(UnmanagedType.LPStr)]string username,
          [MarshalAs(UnmanagedType.LPStr)]string password);
      
      • cdecl 是 C 和 C++ 程序的默认调用约定,
      • 请参阅这些doc 了解更多信息。

      【讨论】:

        【解决方案4】:
            [DllImport("pjsipDlld", CharSet = CharSet.Ansi)]
            static extern int dll_registerAccount(string username, string password);
        

        【讨论】:

          【解决方案5】:

          用于 char* 的 StringBuilder,因为长度未知?

          [DllImport("pjsipDlld")]
          static extern int dll_registerAccount(StringBuilder username, StringBuilder password);
          

          【讨论】:

          • 长度可能未知,但输入和输出的是常量字符串(当然,它们不必是相同的),所以它们完美地映射到string对象。
          • 是的,我在看到您的回答后阅读了这些属性(LPStr 和 LPWStr)。现在很有意义。
          • 当我从 C# 调用 Fortran 子例程时,这对我来说效果很好,而接受的答案却没有。我也有一个已知的长度,这是有效的版本。 YMMV。
          猜你喜欢
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-10
          • 1970-01-01
          相关资源
          最近更新 更多