.net編寫com元件的注意事項
阿新 • • 發佈:2019-02-10
我寫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. [簽名]
右擊專案->屬性->[簽名]標籤, 選中[為程式集簽名]–>[選擇強名稱金鑰檔案]–>[新建],輸入你的金鑰名稱,去掉[使用密碼保護金鑰檔案]
- 生成的時候自動註冊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(); // 這個只是預覽一下