.NET 與 COM+ 互通是企業級遷移的關鍵。本文記錄從建立強名稱金鑰、實作 ServicedComponent、到使用 regsvcs 部署至 COM+ 應用程式的完整流程。
// Visual Studio 開發人員命令提示字元
sn -k keyfile.snk
在 AssemblyInfo.cs 加入:
[assembly: AssemblyKeyFile(@"E:\ClassLibrary1\keyfile.snk")]
或在專案屬性 → 簽署 → 勾選「為組件簽署」選擇 .snk 檔。
using System;
using System.Runtime.InteropServices;
using System.EnterpriseServices;
namespace ClassLibrary1
{
// 固定 GUID,避免每次編譯產生新 CLSID
[Guid("539448DE-9F3B-4781-A1F6-F3C852091FC9")]
public interface ISharpObject2
{
string Name { get; set; }
void Test();
}
// 繼承 ServicedComponent 才能受 COM+ 管理
public class Class1 : ServicedComponent, ISharpObject2
{
private string _name;
public string Name
{
get => _name;
set => _name = value;
}
public void Test() { /* 業務邏輯 */ }
}
}
| 屬性 | 用途 |
|---|---|
[Guid(...)] | 指定介面/類別的固定 GUID,確保版本相容 |
ServicedComponent | 基底類別,提供物件池、交易、角色型安全等 COM+ 服務 |
[Transaction(TransactionOption.Required)] | (可選)宣告交易支援 |
[ObjectPooling(...)] | (可選)啟用物件池 |
// 建置產生 ClassLibrary1.dll
// 使用 regsvcs 註冊至 COM+ 應用程式 "MyCom"
regsvcs /c ClassLibrary1.dll MyCom
/c:建立新的 COM+ 應用程式regsvcs ClassLibrary1.dll 直接安裝元件ClassLibrary1.Class1 存在| 問題 | 原因與對策 |
|---|---|
| 註冊失敗:Access Denied | 需系統管理員權限執行命令提示字元 |
| 呼叫端找不到介面 | 確認介面為 public 且有 [Guid],專案勾選「登錄以進行 COM Interop」 |
| 交易不生效 | 類別需標註 [Transaction],方法不可為 static |
| 版本衝突 | 修改介面必須變更 GUID;實作類別變更可保留 GUID 但需重新註冊 |
// 加入參考:COM 標籤 → "MyCom" 或瀏覽 .tlb
using MyComLib; // 匯入產生的 Interop 組件
var obj = new Class1Class(); // RCW 包裝
obj.Name = "Test";
obj.Test();