系列首篇建立完整基準:使用 **類型化契約** 服務專用字串,從 WCF 服務建立、Proxy 組件產生、強名稱簽章、GAC 安裝、COM 註冊 (Regasm),到 VBScript/VBA/VB6 調用的端到端流程。此模式提供完整型別安全、編譯期檢查、支援設定檔繫結參數調整,是企業級 COM-WCF 整合的標準做法。
WCFServiceMonikerIService1:[ServiceContract]
public interface IService1
{
[OperationContract]
string SayHello(string yourwords);
}
Service1:public class Service1 : IService1
{
public string SayHello(string yourwords)
{
return string.Format("Hello World! You entered: {0}", yourwords);
}
}
Web.config 使用預設 wsHttpBinding,啟用 serviceMetadata httpGetEnabled="true" 與 MEX 端點WCFServiceMoniker,瀏覽 .svc 確認服務運行Clientcall "D:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86 svcutil /language:cs /config:$(ProjectDir)App.config /out:$(ProjectDir)generatedClient.cs https://localhost/WCFServiceMoniker/service1.svc?wsdl
generatedClient.cs,加入專案AssemblyInfo.cs 設定 [assembly: ComVisible(true)]Sign the assembly → 新建強名稱金鑰 WCFServiceMonikerKey.snkSystem.ServiceModel 參考,編譯通過產生 Client.dllREM 批次檔 Reg.bat gacutil /i Client.dll %systemroot%\Microsoft.NET\Framework\v2.0.50727\Regasm Client.dll /t REM 產生 Client.tlb 型別庫
Regasm /t 註冊類型庫並寫入登錄表IService1 介面與 GUID (如 {4FBDA94E-8B89-32EC-BC28-2A0A5E9B7C74})' CallWCFService_TypedContract.vbs
monikerString = "service:address='https://localhost/WCFServiceMoniker/Service1.svc'"
monikerString = monikerString + ", binding=wsHttpBinding"
monikerString = monikerString + ", contract={4FBDA94E-8B89-32EC-BC28-2A0A5E9B7C74}"
Set serviceMoniker = GetObject(monikerString)
WScript.Echo serviceMoniker.SayHello("I am LazyBee, My blog is https://lazybee.cnblogs.com/")
Set serviceMoniker = Nothing

圖 1:VBScript 執行成功
Sub CallWCFService_TypedContract()
Dim monikerString As String
Dim serviceMoniker As Object
monikerString = "service:address='https://localhost/WCFServiceMoniker/Service1.svc'"
monikerString = monikerString + ", binding=wsHttpBinding"
monikerString = monikerString + ", contract={4FBDA94E-8B89-32EC-BC28-2A0A5E9B7C74}"
Set serviceMoniker = GetObject(monikerString)
MsgBox serviceMoniker.SayHello("I am LazyBee, My blog is https://lazybee.cnblogs.com/")
Set serviceMoniker = Nothing
End Sub
VB6 代碼相同。
| 參數 | 範例 | 說明 |
|---|---|---|
address | https://localhost/WCFServiceMoniker/Service1.svc | 服務端點位址 |
binding | wsHttpBinding | 標準繫結類型名稱 (非繫結配置名稱) |
contract | {GUID} | 註冊至 COM 的介面 GUID (大括號包裹) |
| 優點 | 缺點 |
|---|---|
| 完整型別安全、IntelliSense、編譯期檢查 | 需客戶端安裝 .NET Framework 2.0+ |
支援設定檔繫結參數 (bindingConfiguration) | 需產生/部署/註冊 Proxy 組件 (GAC + Regasm) |
| 效能最佳 (無中繼資料下載解析) | 服務介面變更需重新產生 Proxy、重新部署 |
| 支援所有繫結功能 (安全性、可靠會話、交易...) | 不適合無 .NET 環境 (如純腳本、舊版 Office 無 VSTO) |
Client.dll 安裝至 GAC (gacutil /i)Regasm Client.dll /t 成功註冊類型庫Web.config 身分識別 <dns value="localhost" /> 與客戶端呼叫主機名一致類型化契約是 **功能最完整、效能最佳、型別最安全** 的 COM-WCF 整合模式,代價是部署複雜度最高。適用於:企業內部可控環境、需大訊息/複雜繫結配置、追求開發時型別安全的專案。後續三篇將介紹漸進式降低部署依賴的 MEX、WSDL、設定檔技術。