如何调用一个外部函数,它将指针作为输入,从C ++ DLL加载

时间:2018-01-29 09:36:14

标签: c# dll

我有一个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,程序就会崩溃。

有关如何解决此问题的任何想法?

提前谢谢。

1 个答案:

答案 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