C # поддерживает безопасность типов при использовании GCHandle для вывода массива и передачи функции C - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующая подпись метода:

[DllImport("CLibrary.dll", EntryPoint = "deduce", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
unsafe static extern int Deduce(int pItems, int pParams, bool pEntropy, IntPtr pRank, IntPtr pWeight, IntPtr pResults);

Заголовок C:

__declspec(dllexport) int deduce(int p_items, int p_params, bool p_entropy, float* p_rank, float* p_weight, float* p_results)

Я вызываю функцию следующим образом:

// dist, weight, results are float[]
GCHandle p1 = GCHandle.Alloc(dist, GCHandleType.Pinned);
GCHandle p2 = GCHandle.Alloc(weight, GCHandleType.Pinned);
GCHandle p3 = GCHandle.Alloc(results, GCHandleType.Pinned);

int ok = Deduce(items_C, params_C, true, p1.AddrOfPinnedObject(), p2.AddrOfPinnedObject(), p3.AddrOfPinnedObject());

p1.Free();
p2.Free();
p3.Free();

Работает нормально,Что мне не нравится, так это то, что dist, weight и results больше не являются типобезопасными.Они имеют тип float.

Я не понимаю, как обеспечить безопасность типов, если я использую подход GCHandle (который, очевидно, является наиболее эффективным способом закрепления).

Есть ли лучший вариант / способ поддержания безопасности типов?

...