C#中的等效char *

我有一个用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 ++?

非常感谢任何建议,

执行此操作的C#方法是让marshaler在处理字符串时处理char*

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

如果您正在处理宽字符,请用LPWStr替换LPStr

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

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

我通过P / Invoke助手运行了你的C ++系列:

 public partial class NativeMethods { /// Return Type: int ///username: char* ///password: char* [System.Runtime.InteropServices.DllImportAttribute("", EntryPoint="dll_registerAccount")] public static extern int dll_registerAccount(System.IntPtr username, System.IntPtr password) ; } 

所以你是对的,它应该工作。 但是有一些自动封送可用,您应该能够做到:

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

请参阅此MSDN页面有关默认封送处理并覆盖它的信息。

注意调用约定,这让我感到高兴。 在我的情况下,我需要调用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);