C/S封装Activex或者OCX插件
1.新建个项目,然后添加类库,添加类库,如图:
2.在Assemblyinfo.cs里添加:
[assembly: AllowPartiallyTrustedCallers()] //此处是新增加的
3.添加接口类:IObjectSafety,代码:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace OCX { [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.在添加一个用户控件,在页面进行布局:
5.在用户控件代码中,添加代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; namespace OCX { [Guid("8d7d8518-ca58-4863-b94d-3c616fda7b35")]//此为对外开放,最终被调用的ClassID public partial class ActiveX : UserControl, IObjectSafety { delegate void D(object obj); public ActiveX() { InitializeComponent(); } #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 public string GetString() { return DateTime.Now.ToString(); } public DateTime GetDateTime() { return DateTime.Now; } public string[] GetStringArray() { return "H,e,l,l,o".Split(','); } public int GetInt() { return 1; } public double GetDouble() { return 1.0; } public Guid GetGuid() { return Guid.NewGuid(); } public object GetList() { return listBox1; } public string GetListItems() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < listBox1.Items.Count; i++) { sb.Append("{item:'" + listBox1.Items[i].ToString() + "'},"); } return "[" + sb.ToString().Trim(',') + "]"; } public void Start(object obj) { for (int i = 0; i < 10; i++) { Thread t = new Thread(new ParameterizedThreadStart(ShowTime)); t.Start(obj.ToString() + ",线程:" + i.ToString()); } } void ShowTime(object obj) { if (this.listBox1.InvokeRequired) { D d = new D(DelegateShowTime); listBox1.Invoke(d, obj); } else { this.listBox1.Items.Add(obj); } } void DelegateShowTime(object obj) { this.listBox1.Items.Add(obj); } private void buttonX1_Click(object sender, EventArgs e) { Start("Hello World"); } } }
6.安装部署
1.添加一个安装部署项目,如图:
2.会出现下面的页面,选择项目输出,如图:
3.选择项目为自己的项目名称
4.右键主输出来自XX(活动),出现如下画面,在Register选择 vsdrpCom选项
5.重新生成安装部署程序,在Debug或者Release中找到安装文件,进行安装,安装完毕后,进行调用,classid为程序内部类的GUID,Html如下:
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>调用ocx页面</title> <script type="text/javascript"> var fnTest = function(){ var x = document.getElementById("x"); x.Start("这是js中的参数"); } </script> </head> <body> <form id="form1" runat="server"> <object id="x" classid="clsid:8d7d8518-ca58-4863-b94d-3c616fda7b35"></object> </form> </body> </html>
附上源码:下载

浙公网安备 33010602011771号