使用安全模式从DLL(通过(INTPTR)参数传递到该函数)获取char **



我有一个我通过 char**指针的dll:我可以按照vs 2010 c#不安全模式来执行此操作:

public unsafe void loadParamListFromWks()
{
    char** list = null;
    dllFunctionGetList((IntPtr)(&list));
    int i = 0;
    IntPtr ptr;
    while ((ptr = (IntPtr)parameterNames[i]) != IntPtr.Zero)
    {
        Console.WriteLine(Marshal.PtrToStringAnsi(ptr));
        i++;
        ptr = (IntPtr)parameterNames[i];
    }
}  

您看到的DLL填充了我在代码中使用的字符串(列表(的数组(列表(我该如何在安全模式下这样做?我希望得到一个简短的方法。

如果要避免使用unsafe,请尝试以下方式。

使用dll导入属性。

使用名称空间System.Runtime.InteropServices

也用于DLL导入属性中的不同调用约定:

https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention(v = vs.110(.aspx

(粗略代码。未测试(

//DECLARE THE FUNCTION FROM DLL
[DllImport(<<YOUR DLL>>,CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
public static extern void dllFunctionGetList(IntPtr[] ListOfStrs);
//GET THE LIST OF STRINGS
IntPtr[] parameterNames = new IntPtr[100];
dllFunctionGetList(parameterNames);
int i = 0;
IntPtr ptr;
//ITERATE THE STRINGS
while ((ptr = (IntPtr)parameterNames[i]) != IntPtr.Zero)
{
    Console.WriteLine(Marshal.PtrToStringAnsi(ptr));
    i++;
}

最新更新