在C#中编组非托管数组 - 省略大小参数

时间:2015-03-17 20:20:38

标签: c# arrays marshalling

我正在努力解决以下设计问题:

有一个C函数

void Foo(uint8_t *data, uint32_t length);

我想在C#中使用它。所以我创建了委托:

public delegate void Foo_Fcn([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]byte[] data, UInt32 length);
public Foo_Fcn Foo;

所以,这里的(我承认:实际上是次要的)问题是:我必须在我的C#代码中传递第二个参数:

byte[] data = /*...*/;
Foo(data, (UInt32)data.Length);

这似乎有点多余,我更喜欢打电话

byte[] data = /*...*/;
Foo(data);

这是否可以实现(不使用'代理功能')?如果是:如何?

1 个答案:

答案 0 :(得分:2)

不幸的是,没有办法自动执行此操作。

你最好的选择(在我看来)是将C函数包装在.NET类中,在内部隐藏这些细节。这也可以更容易地处理未来对外部API的更改,甚至可能完全更改它,而不需要更改其余的代码。

相关问题