C# 创建ActiveX

第一步:创建一个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;
 
// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assemblyAssemblyTitle("LoginActiveX.Controls")]
[assemblyAssemblyDescription("")]
[assemblyAssemblyConfiguration("")]
[assemblyAssemblyCompany("Orifound")]
[assemblyAssemblyProduct("LoginActiveX.Controls")]
[assemblyAssemblyCopyright("Copyright © Orifound 2011")]
[assemblyAssemblyTrademark("")]
[assemblyAssemblyCulture("")]
 
//自己添加 
[assemblyAllowPartiallyTrustedCallers()]
 
 
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assemblyComVisible(true)]  //注意: 此属性设置为true

 
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assemblyGuid("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值:主句话没弄明白,我每次都是自己生成的):
[ComImportGuid("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 : UserControlIObjectSafety
    {
        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());
        }
    }              
到此为止控件开发完成。
原文地址:https://www.cnblogs.com/jiewei915/p/2547614.html