c# - 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
如果我使用这种方法(这显然是最有效的固定方法),我看不到如何保证类型安全。
有没有更好的选择/方法来维护类型安全?
解决方案
推荐阅读
- sockets - 如何使用 Golang 实现与 Java NIO/AIO 相同的反应器机制
- python - SQLAlchemy 迁移生成具有不同名称的外键。如何丢弃这些?
- ios - 如何在 Swift 中垂直(沿 y 轴)缩放 3D 对象?
- javascript - mongoose 中的 _doc 是什么(console.log 显示有和没有相同的结果)
- bash - 抓取文件中的行并在文件前添加部分行
- python - 编写函数以应用于查看问题行和上方行的 pandas 数据框
- android - 如何在 Termux 中安装 PYEPHEM 模块(pip)?
- c# - 如何重写 URL 越南语字符 IIS Web.Config
- electron - 使用电子构建时如何保留选择的文件
- mysql - 比较 MySQL 中的两个模式并检测兼容性