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#调用C++的DLL搜集整理的所有数据类型转换方式

如何通过 C++-CLI 回调和委托将字符串从 C++-CLI 传递到 C#

(C++/CLI) 如何在 C++ CLI 中获取从本机代码到托管代码的回调?

你推荐 Native C++ 到 C++\CLI 的转变吗? [复制]