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

C# 跨語言互操作實戰(一):C++/CLI 組件實作與編譯細節

     編輯:關於C語言

背景

.NET 允許不同語言編寫的組件無縫互呼叫,只要遵循 CLS 規範。本系列示範以 C++/CLI、VB.NET、C# 分別實作同一介面的字典組件,再由 C# 用戶端統一呼叫。

C++/CLI 組件完整碼

// DICTVC.cpp
#using 
using namespace System;

namespace DICTVC {
    __gc public class DictionaryComponent {
    private:
        String* languageName;
        String* availableLanguages[];

    public:
        DictionaryComponent() {
            languageName = 0;
            availableLanguages = new String*[4];
            availableLanguages[0] = new String(L"Chinese");
            availableLanguages[1] = new String(L"English");
            availableLanguages[2] = new String(L"German");
            availableLanguages[3] = new String(L"French");
        }

        bool LoadLibrary(String* language) {
            for (int i = 0; i < 4; i++) {
                if (language == availableLanguages[i]) {
                    languageName = language;
                    return true;
                }
            }
            return false;
        }

        void FreeLibrary() {
            languageName = 0;
        }

        __property String* get_CurrentLibrary() {
            return languageName;
        }
    };
}

關鍵語法解析

  • __gc public class:宣告受控類別,實例配置於 GC 堆疊。
  • String*:受控字串指標,對應 C# string。
  • __property:定義屬性,僅 get 為唯讀。
  • 陣列需以 new String*[4] 明確配置受控陣列。
  • 建構函式名稱與類別同名,無回傳型別。

編譯與連結雙步驟


cl /clr /c DICTVC.cpp
link /dll /noentry /out:..\Bin\DICTVC.dll DICTVC.obj
  • /clr:產生受控程式碼(MSIL)。
  • /c:僅編譯不連結,產生 .obj。
  • link /dll:連結為 DLL,/noentry 表示無傳統 DLL 進入點(由 CLR 管理)。
  • /out 指定輸出路徑。

組件與模組概念

  • 組件:.NET 部署、版本、安全性的基本單位,含 Manifest、型別中繼資料、IL、資源。
  • 模組:編譯器產出的中間檔(.netmodule),無 Manifest,不可單獨部署。
  • 執行期透過組件 Manifest 定位並繫結型別。

輸出目錄統一管理

將所有組件輸出至 ..\Bin,用戶端以 /reference:..\Bin\*.dll 參考,簡化部署與相對路徑問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved