我有一个我通过 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++;
}