日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# 开发ActiveX控件

發布時間:2023/12/14 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# 开发ActiveX控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.為什么要用ActiveX?

網頁本身的功能是有限的,要想實現一些網頁本身不支持的功能。

2.c#能開發ActiveX嗎?

嚴格意義上講,c#是不能生成純正ocx控件的,我們在vs.net中新建項目時,也找不到專門的"ActiveX項目"新建項,最多也只就能新 建"類庫"得到一個dll而非ocx(因此我們也無法用傳統的regsvr32來注冊該dll),但是c#能開發com組件,activeX控件本質上講 跟com是一類技術,所以用c#開發"能夠讓網頁調用的com類庫"還是可行的。

3.開發步驟:

(1)新建一個類庫
(2)修改項目的"屬性",在“應用程序”選項中找到“程序集信息”按鈕,點擊它,在彈出的界面中勾中“使程序集COM可見(M)”;然后再到“生成”選項中把“輸出”中的“為com互操作注冊”勾中。

(3)修改AssemblyInfo.cs,增加[assembly: AllowPartiallyTrustedCallers()],完整內容類似下面這樣:

1 using System.Reflection;2 using System.Runtime.CompilerServices;3 using System.Runtime.InteropServices;4 using System.Security;5 6 // 有關程序集的常規信息通過下列屬性集7 // 控制。更改這些屬性值可修改8 // 與程序集關聯的信息。9 [assembly: AssemblyTitle("OCXTEST")] 10 [assembly: AssemblyDescription("")] 11 [assembly: AssemblyConfiguration("")] 12 [assembly: AssemblyCompany("")] 13 [assembly: AssemblyProduct("OCXTEST")] 14 [assembly: AssemblyCopyright("Copyright ? 2016")] 15 [assembly: AssemblyTrademark("")] 16 [assembly: AssemblyCulture("")] 17 [assembly: AllowPartiallyTrustedCallers()] 18 19 // 將 ComVisible 設置為 false 使此程序集中的類型 20 // 對 COM 組件不可見。如果需要從 COM 訪問此程序集中的類型, 21 // 則將該類型上的 ComVisible 屬性設置為 true。 22 [assembly: ComVisible(true)] 23 24 // 如果此項目向 COM 公開,則下列 GUID 用于類型庫的 ID 25 [assembly: Guid("b7f60d9f-9669-4960-896a-6e53f6a9cf7a")] 26 27 // 程序集的版本信息由下面四個值組成: 28 // 29 // 主版本 30 // 次版本 31 // 內部版本號 32 // 修訂號 33 // 34 // 可以指定所有這些值,也可以使用“內部版本號”和“修訂號”的默認值, 35 // 方法是按如下所示使用“*”: 36 // [assembly: AssemblyVersion("1.0.*")] 37 [assembly: AssemblyVersion("1.0.0.0")] 38 [assembly: AssemblyFileVersion("1.0.0.0")]

(4)新建一個IObjectSafety接口文件IObjectSafety.cs,內容如下:

1 using System;2 using System.Collections.Generic;3 using System.Text;4 using System.Runtime.InteropServices;5 6 namespace OCXTEST7 {8 [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]9 [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 10 public interface IObjectSafety 11 { 12 [PreserveSig] 13 int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); 14 [PreserveSig()] 15 int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); 16 } 17 }

該內容除命名空間可以更改外,其它內容都是固定的,不要修改
(5)新建一個:Windows Forms-->“用戶控件”,我們的主要邏輯就寫在這里(還可以在它上面隨便放置其它windows常用控件,跟winForm開發一樣),不過首先要修改類定義,讓其實現我們剛才定義的接口。

1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Drawing;5 using System.Data;6 using System.Linq;7 using System.Text;8 using System.Windows.Forms;9 using System.Runtime.InteropServices; 10 11 namespace OCXTEST 12 { 13 [Guid("DD99DBDA-C676-48b9-923E-67C906499353")] 14 public partial class UserControl1 : UserControl, IObjectSafety 15 { 16 public UserControl1() 17 { 18 InitializeComponent(); 19 } 20 21 public int add(int a, int b) 22 { 23 return a + b; 24 } 25 26 #region IObjectSafety 成員 27 28 private const string _IID_IDispatch = " {00020400-0000-0000-C000-000000000046} "; 29 private const string _IID_IDispatchEx = " {a6ef9860-c720-11d0-9337-00a0c90dcaa9} "; 30 private const string _IID_IPersistStorage = " {0000010A-0000-0000-C000-000000000046} "; 31 private const string _IID_IPersistStream = " {00000109-0000-0000-C000-000000000046} "; 32 private const string _IID_IPersistPropertyBag = " {37D84F60-42CB-11CE-8135-00AA004BB851} "; 33 private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001; 34 private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002; 35 private const int S_OK = 0; 36 private const int E_FAIL = unchecked((int)0x80004005); 37 private const int E_NOINTERFACE = unchecked((int)0x80004002); 38 39 private bool _fSafeForScripting = true; 40 private bool _fSafeForInitializing = true; 41 42 public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions) 43 { 44 int Rslt = E_FAIL; 45 46 string strGUID = riid.ToString(" B "); 47 pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; 48 switch (strGUID) 49 { 50 case _IID_IDispatch: 51 case _IID_IDispatchEx: 52 Rslt = S_OK; 53 pdwEnabledOptions = 0; 54 if (_fSafeForScripting == true) 55 pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER; 56 break; 57 case _IID_IPersistStorage: 58 case _IID_IPersistStream: 59 case _IID_IPersistPropertyBag: 60 Rslt = S_OK; 61 pdwEnabledOptions = 0; 62 if (_fSafeForInitializing == true) 63 pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA; 64 break; 65 default: 66 Rslt = E_NOINTERFACE; 67 break; 68 } 69 70 return Rslt; 71 } 72 73 public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions) 74 { 75 int Rslt = E_FAIL; 76 string strGUID = riid.ToString(" B "); 77 switch (strGUID) 78 { 79 case _IID_IDispatch: 80 case _IID_IDispatchEx: 81 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true)) 82 Rslt = S_OK; 83 break; 84 case _IID_IPersistStorage: 85 case _IID_IPersistStream: 86 case _IID_IPersistPropertyBag: 87 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true)) 88 Rslt = S_OK; 89 break; 90 default: 91 Rslt = E_NOINTERFACE; 92 break; 93 } 94 return Rslt; 95 } 96 97 #endregion 98 } 99 }

#region IObjectSafety 成員 ... #endregion這一段的內容是固定的,不要修改,其它內容根據自己的業務要求自行修改,另外類前面要加上Guid的標識,以便網頁調用時,能用CLSID="xxx"來調用

基本上這樣弄完后,就可以在網頁中,用類似下面這樣的代碼來本機調用了:

1 <script type="text/javascript" language="javascript">2 3 function test() {4 var a = csocx.test(2,3);5 alert(a);6 } 7 8 </script>9 <body> 10 <object id="csocx" classid="clsid:A648C7F5-65E5-40F5-817D-FCA25C34BC46"> 11 </object> 12 <input id="c" type="button" value="TEST" οnclick="test();" /> 13 </body>

4.安裝部署

前面已經提到了,c#開發的(偽)"ActiveX"控件并非純正的ocx,所以只能用RegAsm.Exe xxx.dll來進行程序集的注冊,這里要注意一點:在開發機上,項目編譯后vs.net會自動將bin\debug\xxx.dll調用regasm注 冊,但在別人機器上就不行了,為了能在調試時模擬其它機器的運行結果,可以在編譯后,手動用類似 regAsm.exe D:\MyDoc\ActiveXDemo\output\ActiveXDemo.dll /u 來反注冊(在vs.net命令行模式下)


然后在安裝項目上,右鍵"添加"-->"項目輸出"-->"主輸出"-->在項目下拉框中選擇activex所對應的項目即可.

注意:"主輸出來自xxx"的屬性欄中,有一個"Register"必須選擇"vsdrpCOM"

另外還有一個問題,可能是我機器的個別現象,每次activex項目有修改時,建議最好手動清除安裝項目debug目錄下的文件,再重新生成安裝項目,否則有時候會發現activex修改了,但是安裝包中包含的dll還是未修改過的版本。

?

后話:c#開發的東西是運行于.net 框架之上的,就好比java開發的東西必須要java runtime才能運行一樣,利用本文方法開發出來的dll也必須要安裝.net框架才能跑起來,幸好最新的win7中已經集成了.net框架,當然您如 果對于龐大的.net框架安裝程序很敏感,仍然覺得純正的ocx更好的話,建議還是用vb/delphi/c++這一類老牌的開發工具/語言實現。

總結

以上是生活随笔為你收集整理的c# 开发ActiveX控件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。