ActiveX控制元件怎麼用

1.建立Windows窗體控制元件庫

這裡的專案專案名稱為: TestActiveX

   

建立Windows窗體控制元件庫

在預設的使用者控制元件上,放置一個button,並建立單擊事件

   

在使用者控制元件放置button並建立單擊事件

3.建立IObjectSafety介面(重點)

ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]public interface IObjectSafety{    [PreserveSig]    int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);    [PreserveSig()]    int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);}

4.將下面的程式碼,貼上在控制元件類中

#region IObjectSafety  介面成員實現(直接拷貝即可)private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;private const int S_OK = 0;private const int E_FAIL = unchecked((int)0x80004005);private const int E_NOINTERFACE = unchecked((int)0x80004002);private bool _fSafeForScripting = true;private bool _fSafeForInitializing = true;public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions){    int Rslt = E_FAIL;    string strGUID = riid.ToString("B");    pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;    switch (strGUID)    {        case _IID_IDispatch:        case _IID_IDispatchEx:            Rslt = S_OK;            pdwEnabledOptions = 0;            if (_fSafeForScripting == true)                pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;            break;        case _IID_IPersistStorage:        case _IID_IPersistStream:        case _IID_IPersistPropertyBag:            Rslt = S_OK;            pdwEnabledOptions = 0;            if (_fSafeForInitializing == true)                pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;            break;        default:            Rslt = E_NOINTERFACE;            break;    }    return Rslt;}public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions){    int Rslt = E_FAIL;    string strGUID = riid.ToString("B");    switch (strGUID)    {        case _IID_IDispatch:        case _IID_IDispatchEx:            if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))                Rslt = S_OK;            break;        case _IID_IPersistStorage:        case _IID_IPersistStream:        case _IID_IPersistPropertyBag:            if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))                Rslt = S_OK;            break;        default:            Rslt = E_NOINTERFACE;            break;    }    return Rslt;}#endregion

5.在控制元件類,加上Guid特性,生成一個guid,這個在web頁面使用的(切記)

[Guid("4a202141-e8fc-42c8-b061-5d2c5f5cd35d")] //記住這個Guid在頁面上使用,要用這個public partial class UserControl1 : UserControl, IObjectSafety{    //此處省略若干程式碼和事件程式碼}

6.設定程式集資訊和註冊com互操作

在專案屬性,應用程式->程式集資訊

   

設定專案的程式集資訊

設定程式集com可見

   

設定專案的程式集資訊

在專案屬性,生成->為com互操作註冊

   

設定專案的程式集資訊

7.在頁面使用ActiveX控制元件

在這之前,需要將Activex控制元件打包成應用程式,如果是vs2017的話,預設沒有打包工具,在vs2017的應用商店中安裝,搜尋關鍵字 Installer 即可.

測試Activex控制元件

看測試結果:

   

測試Activex控制元件是否可用

最重要的一步
   在AssemblyInfo.cs檔案,新增以下程式碼

//一定要加的[assembly: AllowPartiallyTrustedCallers()]

進入真正的主題,因為上面都是準備工作的

1.在控制元件類,新增該函式

//////  公開呼叫,該函式要public去修飾,其他和正常函式一樣//////文字引數///返回撥用結果public string TestActiveXMethod(string txt){    return $"hello {txt}";}

2.在頁面上呼叫公開的csharp函式

測試Activex控制元件    var btnCallActiveX = document.getElementById('btnCallActiveX');        var txtUserName = document.getElementById('txtUserName');        btnCallActiveX.onclick=function(){            //呼叫ActiveX控制元件, 控制元件id 後跟控制元件公開的函式            var callResult = TestActiveX.TestActiveXMethod(txtUserName.value);            alert(callResult);        };

呼叫結果:

   

ActiveX呼叫公開的函式,進行和csharp互動操作

由於是遷移的文章,Activex現在用的比較少了,在特定的行業中還是有使用的,比如醫療行業軟體,不過使用的是越來越少.