У меня есть следующая подпись метода:
[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
(который, очевидно, является наиболее эффективным способом закрепления).
Есть ли лучший вариант / способ поддержания безопасности типов?