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から未知のサイズの配列を単に返すことを試みています。