熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用C#編寫ActiveX控件

2013-11-13 10:27:19  來源: .NET編程 
首先建立一個WinForm控件項目HelloWorld並拖入一個Label控件文字設為HelloWorld如圖

  

  UserControlcs內容如下 


using System; 
using SystemCollections; 
using SystemComponentModel; 
using SystemDrawing; 
using SystemData; 
using SystemWindowsForms; 
 
namespace HelloWorld 

    /**//// <summary> 
    /// UserControl 的摘要說明 
    /// </summary> 
    public class Demo : SystemWindowsFormsUserControl 
    { 
        private SystemWindowsFormsLabel label
        /**//// <summary> 
        /// 必需的設計器變量 
        /// </summary> 
        private SystemComponentModelContainer components = null; 
 
        public Demo() 
        { 
            // 該調用是 WindowsForms 窗體設計器所必需的 
            InitializeComponent(); 
 
            // TODO: 在 InitComponent 調用後添加任何初始化 
 
        } 
 
        /**//// <summary> 
        /// 清理所有正在使用的資源 
        /// </summary> 
        protected override void Dispose( bool disposing ) 
        { 
            if( disposing ) 
            { 
                if( components != null ) 
                    componentsDispose(); 
            } 
            baseDispose( disposing ); 
        } 
 
        組件設計器生成的代碼#region 組件設計器生成的代碼 
        /**//// <summary> 
        /// 設計器支持所需的方法  不要使用代碼編輯器  
        /// 修改此方法的內容 
        /// </summary> 
        private void InitializeComponent() 
        { 
            thislabel = new SystemWindowsFormsLabel(); 
            thisSuspendLayout(); 
            //  
            // label 
            //  
            thislabelLocation = new SystemDrawingPoint( ); 
            thislabelName = label
            thislabelSize = new SystemDrawingSize( ); 
            thislabelTabIndex = 
            thislabelText = HelloWorld
            thislabelTextAlign = SystemDrawingContentAlignmentMiddleCenter; 
            //  
            // Demo 
            //  
            thisControlsAdd(thislabel); 
            thisName = Demo
            thisSize = new SystemDrawingSize( ); 
            thisResumeLayout(false); 
 
        } 
        #endregion 
    } 
}

  此時編譯項目可以生成HelloWorlddll將此dll拷貝到IIS的虛擬根目錄下然後建立一個的文件html代碼如下 


<body bgcolor=#
<object id=helloworld classid=#HelloWorldDemo Width= Height= VIEWASTEXT> </object> 
</body>

  在IE地址欄中輸入以下地址出現界面

  

  如圖控件已經成功在頁面上顯示了OK我們已經完成了第一步

    但是問題到這裡還沒有解決不相信?你可以試試在另外一台機器上測試注意需要修改對應的html代碼和URL地址你可以看到這個在原來顯示控件的地方是一個紅色的叉或者還會彈出一個對話框表示這個控件沒有任何權限出現這個結果是微軟的默認設置造成的作者必須在控件所在的控件的 AssemblyInfocs/vb 中執行一個安全聲明聲明這個控件必須使用賦予的權限才可以顯示出界面我們在AssemblyInfocs中引用SystemSecurity命名空間並添加一句 


[assembly : AllowPartiallyTrustedCallers()]

  現在重新編譯並且替換以前的dll界面又可以顯示出來了 

  需要提醒的是到現在為止我們編寫的還不是真正的ActiveX控件這個控件到現在為止還只是能夠實現自身的顯示並且不能實現更多的功能比如實現與腳本的交互或者操作客戶端的注冊表或者磁盤這是由於Net Framework的安全模型所限制的如果我們希望這個控件突破Net Framework安全模型的限制實現與腳本的交互或者操作客戶端的注冊表或者磁盤的話必須要讓它成為真正的ActiveX控件下面我們把剛才的控件變成真正的ActiveX控件

    首先使用 工具—〉創建GUID 生成一個GUID並修改UserControlcs文件首先增加引用SystemRuntimeInteropServices命名空間並在Demo前面加入一條語句

  

  注意Guid中的字符串就是你生成的Guid字符串它是你所生成的ActiveX控件的唯一標識符然後修改項目屬性如圖

注意面板中的最後一項我們唯一需要修改的是將其值改為True

    重新編譯我們使用 工具—〉OLE/COM對象查看器 查看如圖

可以看到我們寫的HelloWorldDemo已經被正確識別為COM組件現在我們已經可以像使用其它ActiveX控件一樣在網頁中顯示了在HelloWorldDemo點擊鼠標右鍵如圖


選擇Copy HTML <object> Tag to Clipboard可以將代碼拷入剪貼板

現在我們改寫html代碼如下


<body bgcolor=#
<object id=helloworld 
   classid=clsid:BBCDDEA Width= Height=
</object> 
</body>

  使用IE查看我們的控件又可以在網頁中顯示了不過這個時候它已經不再是以前 WinForm控件了而是貨真價實的ActiveX控件了

 我們在Demo中加入ShowMessage方法 

public void ShowMessage(string msg)  
{  
    if(msg != null)  
    {  
        MessageBoxShow(msg);  
     }  
}  
 我們重新編譯在重新訪問頁面之前我們先來修改html代碼 

<body bgcolor=#
<object id=helloworld 
   classid=clsid:BBCDDEA Width= Height= 

</object> 
<br> 
<input type=button onclick=helloworldShowMessage(Hello World!) value=Click
</body>  
 
現在重新訪問單擊Click按鈕應該可以實現交互了   

    但是結果卻很遺憾我們發現IE跳出了對話框如圖所示

單擊確定之後我們發現JS報錯根據提示我們判斷可以通過修改IE的設置使控件運行打開IE的 工具——〉Internet選項——〉安全——〉本地Intranet——〉自定義級別——〉對沒有標記為安全的ActiveX控件進行初始化和運行將其值設為啟用我們刷新頁面現在終於可以正確運行了 

    當然我們不能指望我們的客戶和我們一樣修改這個值畢竟一是操作麻煩二是給電腦帶來了很大的安全風險在互聯網上搜索之後發現必須要實現IObjectSafety接口把ActiveX控件標記為安全的ActiveX控件在搜索MSDN之後我找到了IObjectSafety接口的定義這就好辦了首先我們自己用C#實現這個接口


[Guid(CBBDCCCFFFCD)InterfaceType(ComInterfaceTypeInterfaceIsIUnknown)]  
public interface IObjectSafety 
{  
    // methods  
  void GetInterfacceSafyOptions(  
     SystemInt riid  
     out SystemInt pdwSupportedOptions  
     out SystemInt pdwEnabledOptions);  
  void SetInterfaceSafetyOptions(  
     SystemInt riid  
     SystemInt dwOptionsSetMask  
     SystemInt dwEnabledOptions);         
}  

注意這個GUID是不能改的然後我們在Demo類裡面實現這個接口增加一下代碼 


IObjectSafety 成員#region IObjectSafety 成員  
 

public void GetInterfacceSafyOptions(Int riid out Int pdwSupportedOptions out Int pdwEnabledOptions) 

            // TODO:  添加 WebCamControlGetInterfacceSafyOptions 實現  
       pdwSupportedOptions = ;  
       pdwEnabledOptions = 
}  
  
public void SetInterfaceSafetyOptions(Int riid Int dwOptionsSetMask Int dwEnabledOptions) 
{  
        // TODO:  添加 WebCamControlSetInterfaceSafetyOptions 實現             
}  
  
#endregion  

  重新編譯然後將IE裡面的設置改回來現在我們發現和JS的交互已經沒有問題了

  在前面我們已經完成了ActiveX控件的開發接下來的就是發布它了

        首先我們建立一個windows安裝項目並將ActiveX控件的主輸出添加到項目輸出中然後改動ActiveX控件的主輸出文件將其Register屬性改為vsdrpCOM如圖:

  

  下一步我們改動項目屬性將引導程序更改為 Web引導程序很遺憾的是在 Web引導程序設置 中的安裝文件夾URL中必須使用絕對路徑不能使用相對路徑這意味著生成安裝程序的時候就必須確定路徑不是很方便在示例中我使用了localhost在發布中可以改為實際的域名

  

  現在我們生成安裝程序並把相應得程序拷貝到正確的目錄中(本例中為默認網站目錄下的ActiveX文件夾中)我們可以直接執行SetupExe文件以驗證安裝文件的正確性在我的機器上正確執行了成功了!

   

  現在我們又要重新改動文件了修改後的結果如下

  <body bgcolor=#>

  <object id=helloworld

  classid=clsid:BBCDDEA Width= Height= codebase=ActiveX/SetupExe

  > 

  </object>

  <br>

  <input type=button onclick=helloworldShowMessage(Hello World!) value=Click>

  </body>

  注意我們在object塊中加入了codebase屬性這就是制定的下載控件的位置可以使用相對路徑別忙我們現在還不能正確請求這個頁面因為我們還沒有對我們的控件進行簽名簽名可以采用兩種方式一種是在上面生成安裝程序的時候簽名另一種是使用snexe簽名推薦大家使用後者因為可以提供更多選項本人很懶就不多寫了大家可以參考csdn上的文章《發布ActiveX》先給給大家提個醒在申請證書的時候選擇 高級證書申請


From:http://tw.wingwit.com/Article/program/net/201311/13684.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.