第一步:创建一个window窗体控件库。设置程序集信息,打开vs2010 GUID生成器生成GUID:
<!--StartFragment -->
勾选为com互操作注册,最好在debug和release下面都勾选(注意,此处如果是在debug状态下修改的,那在调到release状态下还需要再设置一次:
<!--StartFragment -->
打开AssemblyInfo.cs文件,添加:
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security;//自己添加 using System; // 有关程序集的常规信息通过以下 // 特性集控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("LoginActiveX.Controls")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Orifound")] [assembly: AssemblyProduct("LoginActiveX.Controls")] [assembly: AssemblyCopyright("Copyright © Orifound 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] //自己添加 [assembly: AllowPartiallyTrustedCallers()] // 将 ComVisible 设置为 false 使此程序集中的类型 // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, // 则将该类型上的 ComVisible 特性设置为 true。 [assembly: ComVisible(true)] //注意: 此属性设置为true // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID [assembly: Guid("4498e10b-8c59-4eec-bd0a-139fe2c7e65b")]//注意:为刚刚生成的Guid // 程序集的版本信息由下面四个值组成: // // 主版本 // 次版本 // 内部版本号 // 修订号 // // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, // 方法是按如下所示使用“*”: // [assembly: AssemblyVe第二步,添加自己的控件了,添加一个用户控件,打开GUID生成器为控件生成GUID:
[Guid("F51A8749-E7A7-4F76-A82A-7D860C788663")] public partial class LoginContorl : UserControl
其次,为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口,要创建该接口(注意,不能修改该接口的GUID值),IObjectSafety代码如下(注意,不能修改该接口的GUID值:主句话没弄明白,我每次都是自己生成的):
[ComImport, Guid("33F072D8-BFD7-4E80-B667-B63BFF64BE57")] [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); }
注意这里要添加引用:using System.Runtime.InteropServices;
修改控件类,使之继承IObjectSafety接口,代码清单如下:
<!--StartFragment -->
[Guid("F51A8749-E7A7-4F76-A82A-7D860C788663")] public partial class LoginContorl : UserControl, IObjectSafety { public LoginContorl() { InitializeComponent(); } #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 private void btOk_Click(object sender, EventArgs e) { MessageBox.Show("用户名: " + tbUserName.Text.Trim() +" 密码: " + tbPWD.Text.Trim()); } }到此为止控件开发完成。