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

PHP 調用 C# DLL 類庫完整實戰指南

     編輯:PHP 相關知識

PHP 調用 C# DLL 類庫完整實戰指南

當 PHP 項目需要復用 C# 業務邏輯(加密算法、硬件交互、圖像處理等)時,可通過 COM 互操作調用 .NET 組件。本文記錄從 C# 類庫創建、強簽名、註冊 GAC 到 PHP 調用的完整流程(Windows 環境)。

一、C# 類庫準備

  1. 創建 Class Library 專案:命名 HelloWorld。
  2. 設置 COM 可見性:
    • 專案屬性 → Application → Assembly Information → 勾選 Make assembly COM-Visible。
    • 或代碼標記:[ComVisible(true)](需 using System.Runtime.InteropServices;)。
  3. 強命名簽名:
    sn -k HelloWorld.snk  // VS Developer Command Prompt
    
    專案屬性 → Signing → 勾選 Sign the assembly → 選擇 HelloWorld.snk。
  4. 編寫業務類:
    namespace HelloWorld {
        public class Hello {
            public string Write() { return "Hello World"; }
        }
    }
  5. 編譯生成 DLL:bin/Release/HelloWorld.dll。

二、註冊為系統級 COM 組件

以管理員身份運行 VS Developer Command Prompt:

cd /d D:\Path\To\HelloWorld\bin\Release
regasm HelloWorld.dll           // 註冊 COM
gacutil /i HelloWorld.dll       // 安裝到全局程序集緩存 (GAC)

關鍵點:

  • regasm 生成類型庫(.tlb)並寫入註冊表(HKCR\CLSID)。
  • gacutil /i 使組件機器級可用,任意路徑下 PHP 均可調用。無強命名無法進 GAC。
  • 驗證:gacutil /l HelloWorld 列表中應顯示版本、公鑰標記。

三、PHP 測試調用

<?php
try {
    $obj = new COM("HelloWorld.Hello"); // ProgID = 命名空間.類名
    $result = $obj->Write();
    echo $result; // 輸出: Hello World
} catch (com_exception $e) {
    echo "COM Error: " . $e->getMessage();
    // 常見錯誤: 類未註冊、架構不匹配(x86/x64)、權限不足
}
?>

四、架構匹配陷阱(x86 vs x64)

建議:C# 專案勾選 Prefer 32-bit,或顯式編譯為 x86/x64 兩版本分別註冊。PHP 使用 IIS + FastCGI 時,應用池「啟用 32 位應用程序」決定位數。

五、替代方案對比

PHP 進程C# 組件結果
x86 (32-bit)x86 / Any CPU (Prefer 32-bit)✅ 正常
x64 (64-bit)x64 / Any CPU (Prefer 32-bit=off)✅ 正常
x86x64❌ Class not registered
x64x86❌ Class not registered

結論:除非極度依賴進程內調用性能或共享非托管資源,優先選擇 HTTP API 或消息隊列,架構更清晰、運維更友好。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點適用場景
COM 互操作原生調用、性能較好僅限 Windows、部署複雜、版本鎖定緊耦合、高頻調用、需共享內存
命令行執行 exec()跨平台、語言無關、隔離性好進程啟動開銷大、數據傳輸序列化低頻、長耗時、獨立任務
HTTP API (WebAPI/gRPC)標準化、跨語言、可擴展、易監控網絡延遲、需維護服務微服務架構、異構系統集成
消息隊列 (RabbitMQ/Kafka)解耦、削峰、可靠投遞基礎設施複雜異步任務、事件驅動