首页 / C# / 通过互操作将整数数组从C#传递到本机代码
通过互操作将整数数组从C#传递到本机代码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了通过互操作将整数数组从C#传递到本机代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1245字,纯文字阅读大概需要2分钟。
内容图文
我有一个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
}
如何将int [] ai从Main传递给ManagedStuff :: DoSomething?我知道该调用中没有封送处理,因为所涉及的所有代码均已管理.
然后我该如何在ManagedStuff :: DoSomething中编组int ^ _ai来调用UnmanagedStuff :: DoSomething?如果我有一个int [] _ai,则该SO问题的答案中的代码可能会有所帮助(C#: Marshalling a “pointer to an int array” from a SendMessage() lParam).
或者,如何避免使用C#,C interop,Microsoft和Windows,并避免世界遭受苦难?
解决方法:
我只需要指出最初的想法有多糟.
在本机代码中,可以通过传递第一个元素的地址来传递数组,因为可以通过指针算术找到相邻的元素.
在托管代码中,元素也相邻存储,但是将元素传递给int ^框,从而在数组外部进行复制.此副本不会在附近存储任何其他数组元素.
实际上,这也发生在本机跨进程通信中.使用指针算术查找其他元素的技巧仅在过程中有效,通常不适用.
内容总结
以上是互联网集市为您收集整理的通过互操作将整数数组从C#传递到本机代码全部内容,希望文章能够帮你解决通过互操作将整数数组从C#传递到本机代码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。