System::IntPtr 到 C++/CLI 中的 int*
Posted
技术标签:
【中文标题】System::IntPtr 到 C++/CLI 中的 int*【英文标题】:System::IntPtr to int* in C++/CLI 【发布时间】:2013-01-08 17:22:54 【问题描述】:我正在尝试使用 C++/CLI 互操作层从 C# 应用程序调用现有的 C++ 库。我有一个看起来像这样的 C++ 函数:
void doSomething(int* foo, int size);
还有一个 C# 对象,它包含两个字段,一个 IntPtr start 和一个 int 大小。我编写了一个托管 C++ 类,如下所示:
public ref class Wrapper
public:
void run(System::IntPtr itn, int size);
;
现在我想在 Wrapper::run 中调用 doSomething,并让 doSomething 可以访问 C# 对象指向的同一块数据。如果没有副本,我正在尝试做的事情是否可行,如果可以,如何做?
【问题讨论】:
你的意思是写成void run(int% itn, int size)
?如果没有,那么内存需要由某人固定。 不要忽略该要求,最好在 C++/CLI 中使用 pin_ptr 执行此操作,以便 C# 代码可以简单地使用 int[]。
抱歉,我是 CLI 和 C# 的新手,我主要熟悉 C++ 和 C。固定内存有什么作用?
【参考方案1】:
要从 Wrapper::run 调用 doSomething,请尝试转换 System::IntPtr::ToPointer 的返回值,如下所示:
doSomething(reinterpret_cast<int*>(itn.ToPointer()), size);
【讨论】:
以上是关于System::IntPtr 到 C++/CLI 中的 int*的主要内容,如果未能解决你的问题,请参考以下文章
SharpDx:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”
C#中,已知图片内存的首地址(System.IntPtr类),想通过pictureBox显示于窗口,但提示“参数无效”
如何通过 C++-CLI 回调和委托将字符串从 C++-CLI 传递到 C#