国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
要使用C#實(shí)現(xiàn)一個ActiveX控件

要使用C#實(shí)現(xiàn)一個ActiveX控件,需要解決三個問題:

1.使.NET組件能夠被COM調(diào)用

2.在客戶機(jī)上注冊后,ActiveX控件能通過IE的安全認(rèn)證

3.未在客戶機(jī)上注冊時,安裝包能通過IE的簽名認(rèn)證

本程序的開發(fā)環(huán)境是.NET Framework 3.5,工具是Visual Studio .NET 2008,在安裝.NET Framework 3.5的客戶機(jī)上通過測試。

下面是實(shí)現(xiàn)步驟:

(一)創(chuàng)建可從COM訪問的程序集

首先實(shí)現(xiàn)一個對COM可見的程序集,創(chuàng)建類庫工程,AssemblyInfo.cs應(yīng)包含:

using System.Runtime.InteropServices;

//使此程序集中的類型對COM組件可見
[assembly: ComVisible(true)]
// 如果此項(xiàng)目向 COM 公開,則下列 GUID 用于類型庫的 ID
[assembly: Guid("94882155-3B7C-48e3-B357-234D56D8F15E")]

加入以下代碼到AssemblyInfo.cs確保程序集的可訪問性:

using System.Security;

[assembly: AllowPartiallyTrustedCallers()]

注意上面的Guid,如果程序集內(nèi)部的類未標(biāo)注Guid,COM注冊的Guid是會新生成的,此處的Guid沒有作用。

創(chuàng)建用戶控件(自定義類待測)IdentityKey.cs,加入:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace KeyActiveX
{
    [Guid(
"94882155-3B7C-48e3-B357-234D56D8F15E")]
    
public partial class IdentityKey : UserControl
    {
    }
}

這里的Guid和AssemblyInfo.cs一樣,它會在COM注冊中成為CLSID并被html以clsid調(diào)用。

類庫工程屬性中,選擇生成,勾選COM注冊,在html文件中加入

<object id="controlbyid" classid="clsid:{94882155-3B7C-48e3-B357-234D56D8F15E}" ></object>

在IE中啟用不安全控件,查看html頁面,應(yīng)能訪問到控件,現(xiàn)在一個在發(fā)布時對COM注冊的程序集開發(fā)完成了。

使用OLE/COM Object Viewer(安裝VC自帶)可以在.NET Categories中查看組件和CLSID。

 

(二)通過IE安全控件認(rèn)證

如果客戶機(jī)的IE未開啟訪問非安全標(biāo)記的ActiveX控件,通過IE瀏覽上面的步驟開發(fā)出的ActiveX控件,發(fā)現(xiàn)IE會給出警告:

此頁上的 ActiveX 對象可能不安全的。 要允許它將初始化并通過腳本訪問嗎?

或禁止訪問。這是客戶機(jī)IE的安全規(guī)則設(shè)置的,我們應(yīng)該在控件開發(fā)上解決IE安全認(rèn)證的問題。首先我們要了解IE是如何判斷一個ActiveX控件是不安全的,參見Microsoft幫助和支持文檔:

How Internet Explorer Determines If ActiveX Controls Are Safe

There are two ways to mark a control as safe for scripting and initialization: 

1.Implement the IObjectSafety interface. 

2.Provide the following registry keys for the control's CLSID under the Implemented Categories section:

     a.The following key marks the control safe for scripting:
          {7DD95801-9882-11CF-9FA9-00AA006C42C4}

     b.The following key marks the control safe for initialization from persistent data:
          {7DD95802-9882-11CF-9FA9-00AA006C42C4} 

Microsoft recommends that you implement IObjectSafety to mark a control as safe or unsafe. This prevents other users from repackaging your control and marking it as safe when it is not.

我決定實(shí)現(xiàn)IObjectSafety接口來向IE表明ActiveX控件的安全標(biāo)識,以保證控件再次打包時安全標(biāo)識不會被被改寫。

IObjectSafety是一個COM下的接口,對于C++程序來說,只需要實(shí)現(xiàn)它就行了,而.NET之下沒有這個接口,在這種情況下,我們的ActiveX控件就是一個不帶類型庫的COM組件,必須使用C#代碼重新定義COM接口。

這里需要了解一點(diǎn)COM的接口知識。接口是COM的核心,它區(qū)分了在客戶和對象之間使用的契約和實(shí)現(xiàn)。COM的接口有三種類型:定制接口÷分派接口和雙重接口。.NET Framework使用ComInterfaceType對它進(jìn)行了重定義:

namespace System.Runtime.InteropServices
{
    
//
 摘要:
    
//     Identifies how to expose an interface to COM.

    [Serializable]
    [ComVisible(
true
)]
    
public enum
 ComInterfaceType
    {
        
//
 摘要:
        
//
     Indicates the interface is exposed to COM as a dual interface, which enables
        
//
     both early and late binding. System.Runtime.InteropServices.ComInterfaceType.InterfaceIsDual
        
//     is the default value.

        InterfaceIsDual = 0,
        
//

        
// 摘要:
        
//
     Indicates an interface is exposed to COM as an IUnknown -derived interface,
        
//     which enables only early binding.

        InterfaceIsIUnknown = 1,
        
//

        
// 摘要:
        
//
     Indicates an interface is exposed to COM as a dispinterface, which enables
        
//     late binding only.

        InterfaceIsIDispatch = 2,
    }
}

關(guān)于三個接口的具體描述,可以參考《C#高級編程第三版》28.1.3 接口。

在MSDN上查找,可以知道IObjectSafety繼承自IUnknown,是一個定制接口;通過上一章節(jié),可以發(fā)現(xiàn)向COM注冊時,需要提供一個Guid作為CLSID來標(biāo)識程序集中的C#類,事實(shí)上在COM中,接口和類型庫都是帶有Guid作為唯一標(biāo)識的,分別為IID和typelib id。

這樣,通過在C#編寫的接口標(biāo)上需要的COM接口IID,就可以在注冊是向COM表明接口身份了。在Microsoft幫助上查找IObjectSafety定義:

     [
          uuid(C67830E0
-D11D-11cf-BD80-
00AA00575603),
          helpstring(
"VB IObjectSafety Interface"
),
          version(
1.0
)
      ]
      library IObjectSafetyTLB
      {
          importlib(
"stdole2.tlb"
);
          [
              uuid(CB5BDC81
-93C1-11cf-8F20-
00805F2CD064),
              helpstring(
"IObjectSafety Interface"
),
              odl
          ]
          
interface
 IObjectSafety:IUnknown {
              [helpstring(
"GetInterfaceSafetyOptions"
)]
              HRESULT GetInterfaceSafetyOptions(
                        [
in]  long
  riid,
                        [
in]  long *
pdwSupportedOptions,
                        [
in]  long *
pdwEnabledOptions);

              [helpstring(
"SetInterfaceSafetyOptions"
)]
              HRESULT SetInterfaceSafetyOptions(
                        [
in]  long
  riid,
                        [
in]  long
  dwOptionsSetMask,
                        [
in]  long
  dwEnabledOptions);
           }
       }

其中的uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064)就是需要的接口IID。

使用C#編寫IObjectSafety:

using System;
using
 System.Runtime.InteropServices;

namespace
 KeyActiveX
{
    [ComImport, Guid(
"CB5BDC81-93C1-11CF-8F20-00805F2CD064"
)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    
public interface
 IObjectSafety
    {
        [PreserveSig]
        
void
 GetInterfacceSafyOptions(
            
int
 riid,
            
out int
 pdwSupportedOptions,
            
out int
 pdwEnabledOptions);

        [PreserveSig]
        
void
 SetInterfaceSafetyOptions(
            
int
 riid,
            
int
 dwOptionsSetMask,
            
int
 dwEnabledOptions);
    }
}

InterfaceType中一定要使用ComInterfaceType.InterfaceIsIUnknown,因?yàn)镮ObjectSafety繼承自IUnkown。

接下來是KeyActiveX的接口實(shí)現(xiàn):

namespace KeyActiveX
{
    [Guid(
"94882155-3B7C-48e3-B357-234D56D8F15E"
)]
    
public partial class
 IdentityKey : UserControl, IObjectSafety
    {
        
#region IObjectSafety 成員


        
public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
        {
            pdwSupportedOptions 
= 1
;
            pdwEnabledOptions 
= 2
;
        }

        
public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int
 dwEnabledOptions)
        {
            
throw new
 NotImplementedException();
        }

        
#endregion

    }
}


通過返回一個已定值來告訴IE控件是安全的。具體參見

如何在 VisualBasic 控件實(shí)現(xiàn) IObjectSafety

 

(三)簽名發(fā)布

C#開發(fā)的ActiveX控件發(fā)布方式有三種:

  1. 制作客戶端安裝包,分發(fā)給客戶機(jī)安裝;
  2. 制作在線安裝包,客戶機(jī)聯(lián)機(jī)安裝;
  3. 使用html中object的codebase指向安裝包地址。

前兩個比較簡單,適合在局域網(wǎng)內(nèi)實(shí)施,生成安裝包時需要裝Register屬性設(shè)置為vsdrpCOM;最后一種方式,需要在安裝包上進(jìn)行數(shù)字簽名,以保證客戶機(jī)的安全信任。受信任的簽名證書應(yīng)該向證書提供商(如Versign)購買,然后使用簽名工具對安裝包進(jìn)行簽名。

下面利用Visual Studio 2008自帶的測試證書創(chuàng)建工具M(jìn)akeCert和簽名工具SignTool進(jìn)行測試,首先創(chuàng)建一個帶有公司信息的測試證書,在Visual Studio命令提示符后輸入:

makecert -sk ABC -n "CN=ABC Corporation" f:\abccorptest.cer

在F盤上創(chuàng)建了測試證書。然后輸入

signtool signwizard

在Signing Options頁面上,選擇Custom,定義證書文件的位置,再下一步選擇一個加密算法(MD5或SHA1),指定應(yīng)用程序的名稱和描述URL,確認(rèn)。

此時ActiveX控件安裝包有了一個被標(biāo)記為未信任的測試證書,需要將IE設(shè)置為啟用未信任安裝程序,在html中引用

<object id="controlbyid" classid="clsid:{94882155-3B7C-48e3-B357-234D56D8F15E}" codebase="setup.exe" ></object>

客戶機(jī)安裝之后就可以使用ActiveX控件了。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Activex控件開發(fā)
用C#編寫ActiveX控件(二)
ActiveX控件與Internet
VS2005自定義ActiveX控件在asp.net中應(yīng)用方法
c#封裝ActiveX接口實(shí)踐分析
如何將 MFC ActiveX 控件作為安全標(biāo)記為腳本和初始化
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服