一:C#ActiveX控件开发注意事项

 
1:C#开发的ActiveX控件只可在装有Framework的系统上才能用。
2:只有IE浏览器支持。
3:初次安装需要导入代码签名证书及其证书链的方式,
或者Windows其实默认内置了一些权威的CA机构证书,可以向这些机构申请一份代码签名证书及私钥文件来对ActiveX控件签名,这样就可以避免该问题了。但是,向权威的CA机构申请证书是需要付费的,所以需要权衡成本和易用性后,再做出选择。
 

二:开发步骤

ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件。
 

1:必须继承并实现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);
    }
 

2:通常我们会先定义这么一个控件基类去实现改接口

 

ActiveXControl控件基类

  public abstract class ActiveXControl : IObjectSafety

 {

     #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

 }

 

3:实现自己的ActiveX控件功能开发

 

MacActiveX控件类
 [Guid("65D8E97F-D3E2-462A-B389-241D7C38C518")]
 public class MacActiveX : ActiveXControl 
 {
     public string GetMacAddress()   
     {
         var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
         var mos = mc.GetInstances();
         var sb = new StringBuilder();
 
         foreach (ManagementObject mo in mos)
         {
             var macAddress = mo["MacAddress"];
 
             if (macAddress != null)
                 sb.AppendLine(macAddress.ToString());
         }
 
         return sb.ToString();
     }
 }

 

 

三:使用C#开发ActiveX控件 控件开发、制作CAB包、签名、部署

详情见http://www.cr173.com/html/20985_1.html
posted on 2014-04-11 23:20  kenking  阅读(549)  评论(0编辑  收藏  举报