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現在用的比較少了,在特定的行業中還是有使用的,比如醫療行業軟體,不過使用的是越來越少.