1. 程式人生 > >.net編寫com元件的注意事項

.net編寫com元件的注意事項

我寫com元件是基於這篇文章來的.

自己開發機上, pb可以正常呼叫成功.
但是發到其它機器上, 任何一個函式都呼叫失敗…
貌似是元件註冊失敗了, 或者開發環境上面vs生成的時候自動給註冊了.

經過一番考察最後終於知道了.原因

原來是 regasm.exe 命令要求, 如果不是全域性程式集裡面的類, 那麼要加個引數 /codebase

/codebase
 在登錄檔中建立一個 Codebase 項。Codebase 項指定未安裝到全域性程式集快取中的程式集的檔案路徑。如果隨後要安裝正在註冊到全域性程式集快取中的程式集,則不應指定此選項。用 /codebase 選項指定的 assemblyFile 引數必須是具有強名稱的程式集。

強名稱的程式集 也就是簽名的程式集, 這個很簡單.在右擊專案->屬性->簽名->勾上為程式簽名-> 點選下拉框-> 新建-> 金鑰檔名隨便輸入一個名字. 密碼不填也可以. 然後確定.
這樣程式就是強名稱的程式集了.

我在專案裡面加了一個bat檔案. 檔案內容如下.

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe MakeReport.dll /tlb:MakeReport.tlb /codebase
pause

**

總結一下開發步驟

**
1.要開啟Com模式 使程式集COM可見
右擊專案->屬性->[應用程式]標籤-> 點選程式集資訊按鈕,彈出資訊視窗,選中[使程式集COM可見]
2. [簽名]
右擊專案->屬性->[簽名]標籤, 選中[為程式集簽名]–>[選擇強名稱金鑰檔案]–>[新建],輸入你的金鑰名稱,去掉[使用密碼保護金鑰檔案]

  1. 生成的時候自動註冊COM控制元件, (這一步可有可無)
    這個是為了方便開發自動註冊用的,如果你用批處理不設定這一步也可以. 方法是 右擊專案->屬性-> [生成]標籤 ,選中[為COM互操作註冊]

4.程式碼裡別忘了
[ComVisible(true)]
[Guid(“8B82ABE3-28F6-4D99-8618-09BA41467BC9”)]
[ComSourceInterfaces(typeof(IMakeReport))]
[ClassInterface(ClassInterfaceType.None)]
[DispId(1)]
我的程式碼如下

using System;
using System.Collections.Generic; using System.Drawing.Imaging; using System.Drawing.Printing; using System.IO; using System.Net; //using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; //using System.Threading.Tasks; namespace MK { [ComVisible(true)] [Guid("8B82ABE3-28F6-4D99-8618-09BA41467BC9")] public interface IMakeReport { [DispId(1)] void SetReportServerUrl(string url); [DispId(2)] void SetReportPath(string path); // } [ComVisible(true)] [Guid("EA9E240A-1631-4710-A447-559467784F37")] [ComSourceInterfaces(typeof(IMakeReport))] [ClassInterface(ClassInterfaceType.None)] public class MakeReport : IMakeReport { public string ReportPath { get; set; } public Uri ReportServerUrl { get; set; } /// <summary> /// 設定報告單的伺服器路徑 /// </summary> /// <param name="url"></param> public void SetReportServerUrl(string url) { ReportServerUrl = new System.Uri(url); } /// <summary> /// 設定報告單的路徑 /// </summary> /// <param name="path"></param> public void SetReportPath(string path) { ReportPath = path; } } }

**

最重要的簽名,並且註冊指令碼中要有引數/codebase

最重要的簽名,並且註冊指令碼中要有引數/codebase

最重要的簽名,並且註冊指令碼中要有引數/codebase

最重要的簽名,並且註冊指令碼中要有引數/codebase

**
增加手動註冊指令碼檔案. 我的是 [註冊.bat]
內容如下,

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe MakeReport.dll /tlb:MakeReport.tlb /codebase
pause

PB呼叫方的程式碼非常簡單

OLEObject encryption
 
encryption = Create OLEObject
encryption.ConnectToNewObject("MK.MakeReport")//MK是名稱空間, MakeReport 是類名.

encryption.SetReportServerUrl("http://192.168.12.111:8099/ReportServer");
encryption.SetReportPath("/Report Parts/Report1"); 

//encryption.PrintPreview(); // 這個只是預覽一下