我有一个用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 ++?
非常感谢任何建议,
答案 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);