我有一个是用C ++写的DLL。 而且我P /调用调用功能。
我有这个C ++声明。
int dll_registerAccount(char* username, char* password);
我这样做dllimport的声明:
[DllImport("pjsipDlld")]
static extern int dll_registerAccount(IntPtr username, IntPtr password);
请问我的DllImport是等同于C ++使用的IntPtr?
非常感谢您的任何建议,
这样做的C#方法是让封送处理char*
的东西,而你用字符串工作:
[DllImport("pjsipDlld")]
static extern int dll_registerAccount(
[MarshalAs(UnmanagedType.LPStr)]string username,
[MarshalAs(UnmanagedType.LPStr)]string password);
更换LPStr
与LPWStr
,如果你与宽字符工作。
StringBuilder的对于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);
注意调用约定的,这个我绊倒了。 在我来说,我需要调用一个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);
[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更多knowladge