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

Delphi 調用 C# .NET DLL 完整實戰:COM 互操作實現 TripleDES 加解密

     編輯:Delphi

場景背景

項目需發送激活郵件,郵件含用戶密碼,密碼由 C# TripleDES 加密。因時間緊迫,無暇移植算法到 Delphi,決定將 C# 邏輯封裝為 COM 可見組件,Delphi 通過 CreateOleObject 晚綁定調用。

C# 組件構建與註冊全流程

  1. 編寫 C# 類庫 (DotNetFunc.cs):定義 EncryptTripleDES/DecryptTripleDES 方法,標記 [ComVisible(true)]、[ClassInterface(ClassInterfaceType.AutoDual)]、[Guid(...)]。
  2. 生成強名稱金鑰:sn -k key.snk
  3. 編譯帶強名稱的庫:csc /t:library /keyfile:key.snk DotNetFunc.cs (產生 DotNetFunc.dll)
  4. 生成類型庫 (TLB):tlbexp DotNetFunc.dll /out:DotNetFunc.tlb (供 Delphi 早綁定導入用,晚綁定可選)
  5. 註冊組件:regasm DotNetFunc.dll /codebase /tlb:DotNetFunc.tlb (寫入 HKCR,生成 TLB)
  6. 安裝到 GAC:gacutil -i DotNetFunc.dll (確保運行時能找到組件,/codebase 亦可但不推薦生產環境)

Delphi 晚綁定調用代碼

uses Variants, ComObj, ActiveX;

procedure TForm1.Button1Click(Sender: TObject); // 解密
var SharpObject: Variant; TestValue: string;
begin
  try
    SharpObject := CreateOleObject('CSharpServer.SharpObject'); // ProgID: 命名空間.類名
    TestValue := SharpObject.DecryptTripleDES(Edit1.Text);
    Edit2.Text := TestValue;
  except on E: Exception do ShowMessage(E.Message);
  end;
  SharpObject := Unassigned; // 釋放 COM 參考
end;

procedure TForm1.Button2Click(Sender: TObject); // 加密
var SharpObject: Variant; TestValue: string;
begin
  try
    SharpObject := CreateOleObject('CSharpServer.SharpObject');
    TestValue := SharpObject.EncryptTripleDES(Edit2.Text);
    Edit1.Text := TestValue;
  except on E: Exception do ShowMessage(E.Message);
  end;
  SharpObject := Unassigned;
end;

initialization CoInitialize(nil);  // 單元初始化:初始化 COM 庫
finalization CoUninitialize;       // 單元終結:卸載 COM 庫
end.

關鍵技術點解析

環節說明
CreateOleObject晚綁定調用,無需導入 TLB,通過 ProGID 查找 CLSID -> 實例化。返回 Variant,調用成員時動態分發 (IDispatch)。
Variant / UnassignedVariant 持有 IDispatch 接口。置 Unassigned 釋放引用,觸發 COM 引用計數遞減。
CoInitialize/CoUninitialize線程級 COM 庫初始化/清理。VCL 應用主線程通常已初始化,但顯式調用更安全(特別是多線程)。
異常處理.NET 異常跨 COM 邊界會轉為 EOleException,E.Message 含 HRESULT 及錯誤描述。
字符串編碼COM BSTR 為 UTF-16,Delphi 2009+ string 即 UnicodeString,無縫對接。舊版 Delphi 需 WideString。

早綁定替代方案(可選)

若需代碼提示與編譯期檢查,可在 Delphi IDE Component -> Import Component -> Import Type Library 選擇 DotNetFunc.tlb 生成包裝單元,然後使用生成的接口類型:var Obj: ISharpObject; Obj := CoSharpObject.Create;。

常見坑與排查

  • 「類未註冊」:檢查 regasm /codebase 是否以管理員運行,GAC 是否安裝成功 (gacutil -l 查看)。
  • 「文件未找到」:組件依賴項未在 GAC 或應用目錄。用 fuslogvw 診斷綁定失敗。
  • 權限問題:C# 代碼涉及文件/註冊表/網絡時,需確保 COM 宿主進程(Delphi EXE)有足夠權限,或配置 CAS 政策。
  • 64 位兼容:Delphi 32 位 EXE 需 32 位 C# 組件 (x86/JIT),或編譯 64 位 Delphi (10.3+) 配 64 位組件。corflags DotNetFunc.dll /32BIT+ 強制 32 位。

總結

通過 C# COM 可見組件 + 強名稱 + GAC + Delphi 晚綁定,可在極短時間內復用 .NET 生態庫(加密、圖表、報表、機器學習等),避免重複造輪子。此模式適用於「核心邏輯用 .NET,UI/集成用 Delphi」的混合架構場景。

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