我有一个C#项目,我需要使用外部DLL。
dll是使用C ++构建的。我只有描述函数接口(签名)的c ++头文件(.hpp)和.dll(二进制代码)。
我想在我的C#项目中动态加载dll并使用两个函数:
void OpenService(long &handle);
int GetCode(long handle, const char* pin, char* passcode, char* nextPasscode, char* tokencode, char* nextTokencode);
我可以使用System.Runtime.InteropServices中的DllImport加载dll,它适用于第一个使用以下代码的函数:
[DllImport(@"C:\Program Files\Path to my dll\myDll.dll")]
public static extern void OpenService(ref long handle);
但是对于第二个,我尝试了下面的代码:
[DllImport(@"C:\Program Files\Path to my dll\myDll.dll")]
unsafe public static extern int GetCode (long handle, string* pin, string* passcode, string* nextPasscode, string* tokencode, string* nextTokencode);
但是编译器抱怨我应该在编译时使用不安全模式以便能够使用C#指针,这是由于技术主管强加的规则而无法做到的。
所以,我的问题是如何在不使用C#指针的情况下调用第二个函数?
我尝试使用引用如下:
[DllImport(@"C:\Program Files\Path to my dll\myDll.dll")]
public static extern int GetCode (long handle, ref string pin, ref string passcode, ref string nextPasscode, ref string tokencode, ref string nextTokencode);
但是只要我调用GetCode,程序就会崩溃。
有关如何解决此问题的任何想法?
提前谢谢。
答案 0 :(得分:1)
您可以使用MarshalAs方法将字符串编组(转换)为char *类型,而不是使用不安全和指针:
[DllImport(@"C:\Program Files\Path to my dll\myDll.dll")]
public static extern int GetCode (long handle, [MarshalAs(UnmanagedType.LPStr)]string pin, [MarshalAs(UnmanagedType.LPStr)]string passcode, [MarshalAs(UnmanagedType.LPStr)]string nextPasscode, [MarshalAs(UnmanagedType.LPStr)]string tokencode, [MarshalAs(UnmanagedType.LPStr)]string nextTokencode);
UnmanagedType.LPStr
表示该字符串将被编组为
指向以null结尾的ANSI字符数组的指针。
如果您需要unicode,可以使用UnmanagedType.LPWStr
以下是更多信息:
https://docs.microsoft.com/en-us/dotnet/framework/interop/default-marshaling-for-strings