C#实战:创建ActiveX控件读取客户端系统时间

3星 · 超过75%的资源 需积分: 10 54 下载量 54 浏览量 更新于2024-09-29 收藏 347KB PDF 举报
"C#开发ActiveX控件用于在网页中展示客户端系统时间" 在Web开发领域,ActiveX控件是一种古老的但仍然有用的技术,尤其在需要增强浏览器功能或与客户端系统进行深度交互时。ActiveX控件,过去也称为OLE控件或OCX控件,是微软提出的一种软件组件,允许开发者将它们嵌入到网页或其他应用程序中,以提供多媒体、交互式内容和复杂功能。这些控件使得开发者能够扩展浏览器的能力,比如QQ邮箱的大文件上传功能就可能依赖于OCX控件。 通常,ActiveX控件的开发主要使用C++或VB,但本文聚焦于使用C#在Visual Studio 2005环境下创建ActiveX控件。在C/S(客户机/服务器)架构中,当需要客户端执行特定业务功能时,可以安装应用程序来实现。然而,在B/S(浏览器/服务器)架构中,由于所有代码都在服务器端,客户端仅通过浏览器访问,实现类似功能就需要其他方法。这时,ActiveX控件就派上用场了:安装在客户端的浏览器可以调用本地的ActiveX控件执行本地操作,例如获取并显示系统时间。 开发环境包括Windows XP操作系统、Visual Studio 2005 IDE以及.NET Framework 2.0,其中C#语言用于编写控件。以下是如何使用C#开发ActiveX控件的步骤: 1. 创建ActiveX控件项目 在Visual Studio 2005中,通过创建Windows控件库项目来开始。但为了使这个项目成为ActiveX控件,需要进行一些关键的设置。首先,打开项目属性,选择“应用程序”选项卡,勾选“使程序集COM可见”,这使得非托管代码(如JavaScript)能够识别和调用控件。接着,转到“生成”选项卡,勾选“为COMInterop注册”,确保控件能够在COM环境中被注册。 2. 注册安全特性 在项目中,修改AssemblyInfo.cs文件,引入`[assembly: AllowPartiallyTrustedCallers()]`属性,以允许部分受信任的代码调用控件。这需要引用`System.Security`命名空间。 3. 编写代码 在控件类中,编写必要的方法和属性,例如一个获取系统时间的方法。例如: ```csharp public string GetLocalTime() { return DateTime.Now.ToString(); } ``` 4. 测试和部署 编译项目后,生成的ActiveX控件会被注册到系统。然后可以在网页中通过HTML或JavaScript调用该控件的方法,展示客户端的系统时间。例如: ```html <object id="MyTimeCtrl" classid="clsid:YOUR_ACTIVEX_GUID"> </object> <script> var timeCtrl = document.getElementById('MyTimeCtrl'); document.getElementById('timeDisplay').innerText = timeCtrl.GetLocalTime(); </script> ``` 这里的`YOUR_ACTIVEX_GUID`应替换为实际生成的ActiveX控件的CLSID。 总结来说,C#编写ActiveX控件提供了一种在Web环境中与客户端系统交互的途径,虽然现代Web开发中更倾向于使用JavaScript和其他Web标准技术,但在某些特定场景下,ActiveX控件仍然是一个可行的解决方案。然而,需要注意的是,由于ActiveX控件主要适用于Internet Explorer,并且存在安全性问题,因此在现代Web开发中,它的使用已逐渐减少。
2009-11-06 上传
C#版ActiveX + JS +Flex通訊 全實現 因項目部署需要,特把之前寫的與讀卡器通訊的模塊改為ActiveX插件,給Flash調用,由於Flash不能直接調用ActiveX,所以,用JS作為中間層,作為Flash和ActiveX通訊的橋梁。 開發環境:WINXP _EN 開發工具:VS2005,Flex 3. .net 2.0 ActiveX控件開發 1:新建一個工程項目,MyActiveXDemo,選擇Visual C#->Windows Control Library 2:修改UserControl1.cs為ReadICCard.cs 3:設置工程發布屬性,工程屬性->Application->Assembly information, 把Make assembly Com-Visible 勾上。 4:到 工程屬性->Build->Output, 把 Register for COM interop 勾上。 5:修改AssemblyInfo.cs文件,加上紅色方框部分內容: 6:在ReadICCardActiveX 控件里,添加一個GUID,可以使用 工具-创建GUID 菜单创建一个GUID 7:为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值):(這里是直接copy網上的) using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Preresearch.CSharpActiveX { [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); } } 然后在控件类中继承并实现该接口: #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