C++/CLI中System::IntPtr转换为int*

5

我正在尝试使用C++/CLI互操作层从C#应用程序调用现有的C++库。我有一个类似于以下内容的C++函数:

void doSomething(int* foo, int size);

这是一个包含两个字段的C#对象,分别是IntPtr start和int size。我编写了一个托管的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[]。 - Hans Passant
抱歉,我对CLI和C#还不熟悉,我主要熟悉C++和C。固定内存是什么意思? - user220878
1个回答

3
要从Wrapper::run调用doSomething,请尝试将System::IntPtr::ToPointer的返回值强制转换,像这样:
doSomething(reinterpret_cast<int*>(itn.ToPointer()), size);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接