共用方式為


HOW TO:使用 C++ Interop 封送處理內嵌指標

在下列範例中,程式碼會使用 managed, unmanaged #pragma 指示詞,在相同的檔案中實作 Managed 和 Unmanaged 函式,這些函式即使在不同的檔案中定義,也會以相同的方式互相溝通。 只包含 Unmanaged 函式的檔案,不需要以 /clr (Common Language Runtime 編譯) 編譯。

範例

下列範例顯示如何從 Managed 函式呼叫採用包含指標之結構的 Unmanaged 函式。 Managed 函式會建立結構的執行個體,並以新的關鍵字 (而非 gcnew 關鍵字) 初始化內嵌指標。 由於這樣會將記憶體配置到原生堆積上,因此不需要 Pin 陣列來阻止執行記憶體回收。 然而,記憶體必須明確地刪除,以避免記憶體流失。

// 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++ Interop (隱含 PInvoke)