我正在使用 RGiesecke DLLExport 库来生成一个可以从 Delphi 动态加载的 C# DLL。我有这样的方法:
[DllExport("GetVals", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
static void GetVals([In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] valueList, int len)
{
valueList = new int[3];
int[] arrList = new int[] { 1, 2, 3 };
int idx = 0;
foreach (int s in arrList)
{
valueList[idx] = s;
idx++;
}
}
我希望能够从这个调用中返回一个数组,问题是我不会提前知道数组的大小,这只会在运行时确定。
为了测试我做了以下(也在 C# 中)
IntPtr hLibrary = NativeWinAPI.LoadLibrary(DLLFileName);
IntPtr pointerToFunction1 = NativeWinAPI.GetProcAddress(hLibrary, "GetVals");
if (pointerToFunction1 != IntPtr.Zero)
{
GetVals getfunction = (GetVals)Marshal.GetDelegateForFunctionPointer(pointerToFunction, typeof(GetVals));
int[] valList= null;
int fCnt = 3;
getfunction(valList, fCnt);
if (valList != null)
{
}
}
出现错误“尝试读取或写入受保护的内存”,这是可以理解的,因为我没有在调用者上分配内存。在实际使用中,我不知道要返回的数组的大小,因此无法预先分配内存。为了把最基本的东西放在那里,我试图简单地从 GetVals 返回一个未知大小的数组。