首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 與原生 C++ 互操作(二):雙向調用基礎與 P/Invoke 入門

     編輯:關於C語言

互操作有兩條路徑:C++ 調用 .NET 框架,或 .NET 調用 C++。本文從最簡單的場景切入,逐步建立完整認知。

路徑一:C++ 調用 .NET 框架(Managed Extensions)

只需引入兩個組件並用 `/clr` 編譯:

#using <mscorlib.dll>
#using <System.dll>
using namespace System;

void main() {
    Console::WriteLine("Hello, world");
}

編譯:`cl /clr hello.cpp`

托管物件可像原生 C++ 類一樣用 `new` 創建、指標語法訪問:

DateTime d = DateTime::Now;
String* s = String::Format("The date is {0}\n", d.ToString());
Console::WriteLine(s);
Console::WriteLine(s->Length);

路徑二:.NET 調用 C 函數(P/Invoke)

將外部函數聲明為類的靜態成員,用 `DllImport` 指定 DLL:

public class Win32 {
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, int type);
}

// 調用
Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);

常見問題:C++ DLL 參數傳遞錯誤

讀者 Giuseppe 遇到 `Run-Time Error Check Failure #0`,原因是 C# 用 `StdCall` 調用 C++ 的 `ThisCall` 函數。解決方案:編寫托管包裝器而非直接 P/Invoke 成員函數。

核心原則

  • C++ 調用 .NET:優先用 Managed Extensions(或 C++/CLI)
  • .NET 調用 C 函數:P/Invoke
  • .NET 調用 C++ 類:必須寫包裝器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved