C#中的等效char *

时间:2009-09-20 10:32:27

标签: c# pinvoke marshalling

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

我有这个c ++声明。

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

我做了这个dllimport宣言:

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

我的DllImport是否等同于使用IntPtr的c ++?

非常感谢任何建议,

5 个答案:

答案 0 :(得分:23)

执行此操作的C#方法是让编组人员在处理字符串时处理char*内容:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

    [DllImport("pjsipDlld", CharSet = CharSet.Ansi)]
    static extern int dll_registerAccount(string username, string password);

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

  [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 ++程序的默认调用约定
  • 请参阅这些doc1以获取更多知识