使用 C++ Interop (隱含 PInvoke)

與其他 .NET 語言不同的是,Visual C++ 具有互通性支援,可讓 managed 和非受控程式碼存在於相同的應用程式中,甚至在與 managed、非 受控 pragma) (的相同檔案中。 這可讓 Visual C++ 開發人員將 .NET 功能整合到現有的 Visual C++ 應用程式中,而不會干擾應用程式的其餘部分。

您也可以使用 dllexport、dllimport從 managed 編譯單位呼叫非受控函式。

如果您不需要指定函式參數的封送處理方式,或是明確呼叫 DllImportAttribute 時可指定的任何其他詳細資料,則隱含的 PInvoke 會很有用。

Visual C++ 提供兩種方式讓 managed 和非受控函式交互操作:

.NET Framework 會支援明確的 PInvoke,而且大部分的 .net 語言都有提供。 但顧名思義,c + + Interop 是 Visual C++ 特有的。

C++ Interop

C + + Interop 提供更好的型別安全,而且執行起來通常比較繁瑣。 但是,如果未受管理的原始程式碼無法使用或跨平臺專案,則 c + + Interop 不是選項。

C++ COM Interop

Visual C++ 所支援的互通性功能,會在與 COM 元件互通時,提供與其他 .NET 語言的特定優勢。 c + + Interop 不受限於 .NET Framework Tlbimp.exe (型別程式庫匯入工具) 的限制,例如對資料類型的有限支援,以及每個 COM 介面的強制公開,但 c + + Interop 允許在不需要個別 Interop 元件的情況下存取 com 元件。 與 Visual Basic 和 c # 不同的是,Visual C++ 可以使用一般的 com (機制(例如CoCreateInstanceQueryInterface) )直接使用 com 物件。 這是可能的,因為 c + + Interop 功能會導致編譯器自動插入轉換程式碼,以從 managed 移至非受控函式,然後再次返回。

使用 c + + Interop,COM 元件可以用來做為一般用途,也可以包裝在 c + + 類別內。 這些包裝函式類別稱為自訂執行時間可呼叫包裝函式或 CRCWs,而且在應用程式程式碼中,它們有兩個直接使用 COM 的優點:

  • 產生的類別可以從 Visual C++ 以外的語言使用。

  • COM 介面的詳細資料可從 managed 用戶端程式代碼中隱藏。 .NET 資料類型可以用來取代原生類型,而資料封送處理的詳細資料則可以在 CRCW 內以透明的方式執行。

不論是直接使用 COM 或透過 CRCW,引數類型(簡單的引數類型)都必須封送處理。

可複製的類型

若為使用簡單、內 類型的非受控 api (看到) 的全像是,所以不需要進行特殊編碼,因為這些資料類型在記憶體中的表示方式相同,但更複雜的資料類型需要明確的資料封送處理。 如需範例,請參閱 如何:使用 PInvoke 從 Managed 程式碼呼叫原生 dll

範例

// vcmcppv2_impl_dllimp.cpp
// compile with: /clr:pure user32.lib
using namespace System::Runtime::InteropServices;

// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);

// explicit DLLImport needed here to use P/Invoke marshalling because
// System::String ^ is not the type of the first parameter to printf
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]
// or just
// [DllImport("msvcrt.dll")]
int printf(System::String ^, ...);

int main() {
   // (string literals are System::String by default)
   printf("Begin beep\n");
   MessageBeep(100000);
   printf("Done\n");
}
Begin beep
Done

本節內容

如需在 interop 案例中使用委派的詳細資訊,請參閱 委派 (c + + 元件延伸模組)

另請參閱