C# 怎麼建立COM元件 C++中的ATL
環境:VS2012。
1、新建一個類庫專案,命名ComTestDLL。進去後將預設的類Class1改成自己喜歡的名字如ComTest.cs,系統會提醒是否給類改名,選確定;
2、修改Properties目錄下面的AssemblyInfo.cs,將ComVisible屬性設定為true
;然後點選專案->屬性 在生成選項卡的底部位置勾選“為COM互操作註冊”
;如果想加密的話,在簽名選項卡尚勾選為程式集簽名
,建立一個強名稱金鑰。下面就是要新增程式碼了:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ComTestDLL { [Guid("EBD4A297-3BEE-4F29-B6BC-85D9DED1FFD8")] public interface IComTest { [DispId(1)]//指定屬性,欄位,函式的COM排程識別符號 int Add(int x, int y); [DispId(2)] string AddString(string a, string b); } [Guid("E580CBE7-A8E2-4375-A949-C85D6315A326")] [ProgId("ComTestDLL.IComTest")]//允許使用者指定類的ProgId [ClassInterface(ClassInterfaceType.None)]//設定com介面類的型別 public class ComTest : IComTest { public int Add(int x, int y) { return x + y; } public string AddString (string a,string b) { return a+b; } } }
一般會報錯,因為你不是用管理員身份來執行的,如果沒有報錯,恭喜。
刪除線格式
ATL
在COM技術的建立給開發帶來了諸多的便利,但是卻有點難。為了簡化COM程式設計,提高開發效率,人們想了很多辦法。1995年的時候,微軟推出了一種全新的COM開發工具ATL。ATL是ActiveX Template Library 的縮寫,它是一套C++模板。
個人在工作中也用了ATL技術。他會自動生成DLL檔案,需要你 注意幾個檔案。
刪除線格式
“MyATL_i.h”、“MyATL_i.c”(這個檔案主要用來檢視CLSID_MyATLClass和IID_IMyATLClass的值)
刪除線格式
還有一個.idl檔案。
IDL(介面描述語言)_
interface IMyATLClass : IDispatch{
[id(1)] HRESULT Sum([in] LONG para1, [in] LONG para2, [out] LONG* sum);
[id(2)] HRESULT PopupDialog([in] CHAR* text);
library MyATLLib中類定義的順序決定了GetTypeInfo中index引數的值
刪除線格式
應有的檔案如下圖:
(網上down來的)
刪除線格式
例子
//在CPP裡面寫
STDMETHODIMP MyClass::Cal()
{
...
return S_OK;
}
//在.h檔案裡面寫
STDMETHOD Cal();
//在idl裡面寫
[id(5)] HRESULT Cal( [in] int i,[out,retval] int* pVal);//in代表輸入 ,out代表 輸出,retval代表返回值。
然後就會 生成一個介面指標,我們在C#裡面就可以通過指標讀了。 比如
#region 程式集 Interop.WaxCal.dll,v1.1.0.0;
//D:\...\Interop.WaxCal.dll
#endregion
using System;
using System.Runtime.InteropServices;
namespace Interop.WaxCal
{
[Guid("7CECEF52-A386-47CD-A8FA-AB9A463A23D1")]//是不是跟COM元件很像啊。
[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
public interface ICal
{
//可以是類,也可以是函式
[DispId(2)]
WaxCar waxCar{get;set;}
[Displd(3)]
void WaxAdd{get;set;}
//按順序會自動新增 。
}
}
我們要用 的話就定義一個指標物件。
IWaxCal wax;
wax. 裡面註冊好了的東西就會出來 。
刪除線格式
注意區別,特別是語言別混了。一個是C#的COM元件,一個是C++中的ATL。