我正在努力解决以下设计问题:
有一个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);
这是否可以实现(不使用'代理功能')?如果是:如何?
答案 0 :(得分:2)
不幸的是,没有办法自动执行此操作。
你最好的选择(在我看来)是将C函数包装在.NET类中,在内部隐藏这些细节。这也可以更容易地处理未来对外部API的更改,甚至可能完全更改它,而不需要更改其余的代码。