使用C#创建ActiveX控件步骤详解

需积分: 0 5 下载量 120 浏览量 更新于2024-09-10 1 收藏 761KB DOCX 举报
"这篇内容是关于使用C#在Visual Studio 2008环境下开发ActiveX控件的个人描述,主要涉及的操作步骤包括创建Windows窗体控件库项目,设置程序集为COM可见,为COM互操作注册,以及编写一个简单的用户控件UcCard,该控件具有读卡功能。" 在C#中开发ActiveX控件,可以将.NET Framework中的类暴露给不使用.NET技术的环境,如旧版的网页或VBA应用。以下是一些关键知识点: 1. **ActiveX控件**:ActiveX是微软推出的一种组件技术,允许开发者创建可嵌入到其他应用程序或网页中的小应用程序。这些控件可以通过OLE(对象链接和嵌入)进行交互,提供跨平台的兼容性。 2. **开发环境**:在Windows 7操作系统上,使用Visual Studio 2008作为开发工具,并且需要.NET Framework 2.0支持C#编程。 3. **创建项目**:首先,你需要新建一个"Windows窗体控件库"项目,这里命名为WfclCard。这个项目会包含你需要创建的ActiveX控件。 4. **使程序集COM可见**:在项目的属性设置中,勾选"使程序集COM可见",这使得非.NET环境的应用程序能够识别并使用这个控件。 5. **为COM互操作注册**:在生成选项中,勾选"为COM互操作注册",这一操作会自动为控件生成必要的注册信息,以便于在其他非托管环境中使用。 6. **用户控件UcCard**:创建名为UcCard的用户控件,这是ActiveX控件的核心。在UcCard.cs文件中,定义控件的属性、方法和事件。例如,这里有一个ReadCard方法,用于读取卡片信息。 7. **Guid定义**:在用户控件的定义中,使用`[Guid("e7aff51e-2a91-4174-b7ab-7e6ee0129e80")]`指定了一个全局唯一标识符(GUID),这个ID是ActiveX控件在COM世界中的身份。 8. **Interop服务**:C#通过.NET Framework的Interop服务与COM组件进行交互,使得.NET代码可以调用COM接口,反之亦然。 9. **读卡功能**:示例中的ReadCard方法演示了如何从卡片中读取信息,可能涉及与硬件设备(如智能卡读卡器)的通信,这里使用了CpuCardSDK的函数`ZGH_ReadRootEGS002File`来读取数据。 10. **数据处理**:读取到的原始数据是字节流,需要进一步处理(如解码、分割)才能得到有意义的信息。在这个例子中,通过`Encoding.Default.GetString()`将字节流转换为字符串,然后用`Split('|')`来拆分信息。 开发C# ActiveX控件涉及到的知识点包括.NET Framework的COM互操作、用户控件设计、以及与硬件设备的通信等,这些技术使得开发者能构建跨平台、跨语言的组件解决方案。
1001 浏览量
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