首页 > 解决方案 > C# 在使用 GCHandle 固定数组并传递给 C 函数时保持类型安全

问题描述

我有以下方法签名:

[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如果我使用这种方法(这显然是最有效的固定方法),我看不到如何保证类型安全。

有没有更好的选择/方法来维护类型安全?

标签: c#cpinvokemarshallingdllimport

解决方案


推荐阅读