為com互操作注冊
Ⅰ C#項目屬性中生成菜單中沒有「為Com互操作注冊」復選框
親,你右邊滾動條沒有拉到底!
在「輸出」下面
Ⅱ 注冊C# 生成的COM組件
要想用.NET開發組件動態鏈接庫,並將類和資源公開以服務於其他任何編程語言,需要在項目中做以下設置:
1、創建一個類庫項目/解決方案(此例TestCom),打開項目屬性
2、選擇「應用程序」選項卡,點擊「程序集信息」按鈕以打開程序集信息對話框
此處也可維護程序集名稱和命名空間
3、在程序集對話框中勾選「使程序集COM可見」,然後確定。
此處也可維護項目版本信息和GUID,當GUID有沖突時可以通過VS的「工具」菜單中點擊「創建GUID」來獲取,一般為默認。
4、選擇「生成」選項卡,勾選「為COM互操作注冊」。
如需要同時將注釋與DLL一起分享出去,以方便其他程序員了解你的DLL介面和說明,則勾選「XML文檔文件」,如此生成項目時會將項目中所有注釋生成一個XML文檔。
需要注意的是,該配置是獨立的,也可以將配置項設置為「所有配置」。
5、選擇「簽名」選項卡,勾選「為程序集簽名」,然後點擊新建,打開「創建強名稱密鑰「窗口。
6、維護密鑰文件名,然後確認。
如果需要防反編譯,則勾選密碼保護密鑰文件,然後設置密碼(不設置密碼不影響DLL注冊到系統)。
7、DLL注冊
每次編譯之後都要重新注冊一次,以更新注冊信息,VS2019在生成(編譯)項目之後會自動注冊,這點非常方便。而VS2010及以前的版本需要手工操縱(其他版本沒用過)。
VS2010注冊步驟:
為了方便操作,搜索到regasm.exe,將其復制到DLL所在文件夾,然後按WIN+R鍵後輸入CMD打開命令窗口,
用CD命令定位到DLL所在文件夾輸入以下命令:
Regasm<項目名稱>.dll/tlb:<項目名稱>.tlb/codebase
其中<項目名稱>替換為你的項目名稱,也可以將命令編輯到BAT文件,這樣每次編譯之後執行bat即可。
到此為止大功告成,VBA中或其他編程環境就可以調用C#開發的組件對象了。
8、編寫類和介面代碼
要讓組件中的所有需要公開的資源可見,必須為其創建介面。見圖例
示例中定義了一個Class1的類,該類只有一個方法Link,用於拼接字元串,為了公開此類和方法,必須再定義一個介面。
(定義介面時有個簡單的方法,當你調試好類代碼之後,復制整個類代碼,然後將Class關鍵詞改為interface,然後去掉所有方法的修飾詞public以及實體代碼並補一個分號。)
最後生成完成編譯,編譯之後需要注冊以更新(VS2019會自動注冊)。
這里要說明的是,幾番測試發現,VS2019中不定義介面也能調用,只是無法使用點操作符顯示方法/屬性列表。
9、ExcelVBA中調用組件。
按alt+F11打開你的VBA項目,然後從菜單中打開引用,滾動到TestCom(或者是你的組件名)並勾選,如果沒找到回到VS檢查項目屬性是否設置正確。
10、在模塊中調用類庫。
懶得編輯插圖了,見我的博客園文章
C#組件項目設置與開發應用範例
Ⅲ 如何使用.NET開發全版本支持的Outlook插件產品
創建工程環境
有了以上的框架技術基礎,我們就可以來創建我們的第一個Outlook插件項目了,因為我現在用的是Office 2013,我們先做一個簡單的Outlook 2013插件好了。其實這個插件2010也能用,因為插件UI是用Ribbon。
我們先用「管理員身份」運行Visual Studio。因為我們開發的是一個COM類型的類庫,而這個類庫需要向注冊表注入一些鍵值,VS需要管理員身份才能自動完成這些操作。你問怎麼用管理員身份運行?在圖標上右鍵點擊,展開的菜單裡面就有。
然後我們創建一個「類庫」項目,我們起個項目名稱叫「TestOutlookAddin」,記得.NET的版本是3.5。隨後我們添加NetOffice相應3.5版本的以下dll文件引用:
extensibility.dll
NetOffice.dll
OfficeApi.dll
OutlookApi.dll
我們再調整解決方案的編譯環境,必須要有x86和x64兩種。因為插件是對Office版本敏感的,x64的Office只能載入x64編譯得到的插件dll,同樣的,x86版本Office也只能載入x86版本dll。
我們還要對項目進行屬性設置。
在「應用程序」標簽頁中,點擊「程序集信息…」,在打開的對話框中勾選「使程序集COM可見」。
在「生成」標簽頁中,勾選「為COM互操作注冊」。
在「調試」標簽頁中,將「啟動操作」勾選「啟動外部程序」,並且填入你機器上的Outlook.exe啟動路徑,在我的機器上,路徑如下:
C:\Program Files\Microsoft Office\Office15\OUTLOOK.EXE
修改完這個以後,我們先進入C:\Program Files\Microsoft Office\Office15\,也就是Outlook.exe的所在文件夾,看看有沒有outlook.exe.config文件。如果沒有這個文件,請創建這個文件,並在文件裡面寫入以下XML
xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v1.0.3705" />
<supportedRuntime version="v1.1.4322" />
<supportedRuntime version="v2.0.50727" />
startup>
configuration>
這個文件必須和Outlook.exe在同一個文件夾中。如果沒有這個文件,我們將無法進入調試狀態。我想沒有人能在不調試的情況下編寫一整個插件吧?
編寫樣例代碼
我們把環境的裝備工作做好了,下面就來編寫最簡單的插件。
我們先在項目中創建一個RibbonUI.xml,並把它的生成操作定義為「嵌入的資源」,內容如下:
xml version="1.0" encoding="utf-8" ?>
<customUI onLoad="LoadAction" xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon>
<tabs>
<tab id="RibbonAddinSampleTabCS35" label="插件標簽">
<group id="group1" label="分組名">
<button id="customButton1" size="large" label="按鈕"/>
group>
tab>
tabs>
ribbon>
customUI>
對於Outlook 2007以上的版本來說,這個文件就是定義新增的菜單欄界面的。
然後再在項目中創建一個名為COMEntry的類,代碼如下:
using System.Runtime.InteropServices;
using NetOffice.OutlookApi.Tools;
using NetOffice.Tools;
namespace TestOutlookAddin
{
[COMAddin("Test Addin For Outlook", "", 3), CustomUI("TestOutlookAddin.RibbonUI.xml"), RegistryLocation(RegistrySaveLocation.CurrentUser)]
[Guid("AFE67651-951D-4A42-8CAB-E9BF7E219DDF"), ProgId("TestAddinForOutlook")]
public class COMEntry : COMAddin
{
}
}
其中COMAddin特性類聲明了一系列需要載入和插件初始化的信 息,它的參數有「插件在Outlook插件列表中的顯示名稱」,「插件在列表中的描述」,「啟動類型(3代表跟隨Outlook啟動而自動啟動)」。
CustomUI表示了剛才我們定義的RibbonUI.xml作為嵌入的資源的資源訪問路徑,這點對於有一定經驗的.NET開發人員一定不陌生。
RegistryLocation是定義了插件在注冊表中注冊到哪個根鍵值裡面去。我們知道現在Windows安裝文件都有「僅為我」和「所有人」安裝選項,這個特性也是為了區分它的。不過這個僅僅是在調試狀態下,因為發布的時候這個鍵值還是會由我們的安裝包來自行控制,所以不需要在這個地方做過多糾結。
好了,我們在VS按下F5調試查看一下效果吧
我們得到了一個新的標簽,標簽內部有個新的分組和空白的「按鈕」,滑鼠移到按鈕上,就會自動出現下面的彈出說明框。
在此,需要先進行一個聲明,下方的這個彈出說明框是可以自定義標題和內容的,但是最下方的插件名稱超鏈接和「詳細信息」是無法去掉的。微軟官方的解釋是:為了區分這個到底是一個第三方插件還是Outlook自身自帶的按鈕。因為他們擔心一些質量很差的插件影響了Outlook自身的行為,用戶還要怪罪到微軟頭上。因此他們就用這種方法來明顯區別插件和自身控制項了。