如何解决通过互操作将整数数组从C#传递到本机代码
|| 我有一个Blah.cs:public unsafe static int Main()
{
int[] ai = {1,2,3,4,5};
UIntPtr stai = (UIntPtr) ai.Length;
CManagedStuff obj = new CManagedStuff();
obj.DoSomething(ai,stai);
}
然后是ManagedStuff.cpp:
void CManagedStuff::DoSomething(int^ _ai,UIntPtr _stai)
{
// Here I should do something to marshal the int^ to an int*
pUnmanagedStuff->DoSomething(_ai,(size_t) _stai);
}
还有一个UnmanagedStuff.cpp:
void CUnmanagedStuff::DoSomething(int* _ai,size_t _stai)
{
// Walk and print the _stai ints in _ai
}
如何将Main3ѭ从Main传递给ManagedStuff :: DoSomething?我知道该调用中没有封送处理,因为所涉及的所有代码均已管理。
然后我该如何在ManagedStuff :: DoSomething中封送int^ _ai
来调用UnmanagedStuff :: DoSomething?如果我有一个“ 5”字,那么这个SO问题的答案中的代码可能会有所帮助(C#:从SendMessage()lParam中整理“指向int数组的指针”)。
或者,如何避免使用C#,C ++互操作,Microsoft和Windows并停止世界的痛苦?
解决方法
我只需要指出最初的想法有多糟。
在本机代码中,可以通过传递第一个元素的地址来传递数组,因为可以通过指针算术找到相邻的元素。
在托管代码中,元素也被相邻存储,但是将一个“ 6”框传递给元素,从而在数组外部进行复制。此副本不会在附近存储任何其他数组元素。
实际上,这也发生在本机跨进程通信中。使用指针算术查找其他元素的技巧仅在过程中有效,通常不适用。
,您必须固定托管资源(您的数组),因此当您使用指针时,垃圾收集器不会移动它。
在C#中,可以使用
fixed
语句执行此操作:fixed语句(C#参考)
C ++中的固定与固定指针一起使用,在范围内固定被管理对象。 (指向任何元素的指针将固定整个数组):
// In CManagedStuff:
pin_ptr<int> _aiPinned = _ai
更多信息:实际中的C ++ / CLI-使用内部和固定指针
,好的,我已经像这样工作了:
void CManagedStuff::DoSomething(array<int>^ _ai,UIntPtr _stai)
{
// Here I should do something to marshal the int^ to an int*
pin_ptr<int> _aiPinned = &_ai[0];
pUnmanagedStuff->DoSomething(_aiPinned,(size_t) _stai);
}
首先,通过ѭ10。
其次,正如Tamschi所建议的那样,使用一个指向阵列中第一个元素地址的引脚指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。