如何:使用 C++ 互操作封送嵌入式指针

下面的代码示例使用 managed, unmanaged #pragma 指令在同一个文件中实现托管函数和非托管函数,但如果在不同的文件中定义这些函数,则它们将以同样的方式进行交互操作。 不需要使用 /clr(公共语言运行时编译) 对仅包含非托管函数的文件进行编译。

示例

下面的示例演示如何从托管函数调用采用包含指针的结构的非托管函数。 该托管函数创建该结构的一个实例,并使用新关键字(而不是 gcnew 关键字)对嵌入的指针进行初始化。 由于是在本机堆上分配内存,因此不需要固定该数组以取消垃圾回收。 但是,必须显式删除内存,以避免内存溢出。

// marshal_embedded_pointer.cpp
// compile with: /clr
#include <iostream>

using namespace System;
using namespace System::Runtime::InteropServices;

// unmanaged struct
struct ListStruct {
   int count;
   double* item;
};

#pragma unmanaged

void UnmanagedTakesListStruct(ListStruct list) {
   printf_s("[unmanaged] count = %d\n", list.count);
   for (int i=0; i<list.count; i++)
      printf_s("array[%d] = %f\n", i, list.item[i]);
}

#pragma managed

int main() {
   ListStruct list;
   list.count = 10;
   list.item = new double[list.count];

   Console::WriteLine("[managed] count = {0}", list.count);
   Random^ r = gcnew Random(0);
   for (int i=0; i<list.count; i++) {
      list.item[i] = r->NextDouble() * 100.0;
      Console::WriteLine("array[{0}] = {1}", i, list.item[i]);
   }

   UnmanagedTakesListStruct( list );
   delete list.item;
}
  

请参见

参考

使用 C++ 互操作(隐式 PInvoke)