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);