C#程序注册dll文件

  • 不需要管理员权限和RegAsm.exe文件
public static bool RegCom(string path){
	Assembly assembly = Assembly.LoadFile(path);
	Type[] Types = assembly.GetExportedTypes();

	foreach (Type type in Types){
	ComVisibleAttribute[] attributes = (ComVisibleAttribute[])type.GetCustomAttributes(typeof(ComVisibleAttribute), false);
	if (attributes.Length > 0 && attributes[0].Value) {
        Register(type);
	}
	}
}

static void Register(Type type)
{
    string ProgID = type.FullName;
    string Version = type.Assembly.GetName().Version.ToString();
    string GUIDstr = "{" + type.GUID.ToString() + "}";
    string keyPath = @"Software\Classes\";


    RegistryKey regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);

    RegistryKey regularx64View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
 
    RegistryKey[] keys = {regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl),
                    regularx64View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl)};

            
    ProgIdAttribute[] attributes = (ProgIdAttribute[])type.GetCustomAttributes(typeof(ProgIdAttribute), false);

    if (attributes.Length > 0)
        ProgID = attributes[0].Value;

    foreach(RegistryKey RootKey in keys)
    {
        //[HKEY_CURRENT_USER\Software\Classes\Prog.ID]
        //@="Namespace.Class"
                
        RegistryKey keyProgID = RootKey.CreateSubKey(ProgID);
        keyProgID.SetValue(null, type.FullName);

        //[HKEY_CURRENT_USER\Software\Classes\Prog.ID\CLSID]
        //@="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
        keyProgID.CreateSubKey(@"CLSID").SetValue(null, GUIDstr);


        //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}]
        //@="Namespace.Class
        //
        RegistryKey keyCLSID = RootKey.OpenSubKey(@"CLSID", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl).CreateSubKey(GUIDstr);
        keyCLSID.SetValue(null, type.FullName);


        //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\ProgId]
        //@="Prog.ID"
        keyCLSID.CreateSubKey("ProgId").SetValue(null, ProgID);


        //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\InprocServer32]
        //@="mscoree.dll"
        //"ThreadingModel"="Both"
        //"Class"="Namespace.Class"
        //"Assembly"="AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=71c72075855a359a"
        //"RuntimeVersion"="v4.0.30319"
        //"CodeBase"="file:///Drive:/Full/Image/Path/file.dll"
        RegistryKey InprocServer32 = keyCLSID.CreateSubKey("InprocServer32");
        SetInprocServer(InprocServer32, type, false);

        //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\InprocServer32\1.0.0.0]
        //"Class"="Namespace.Class"
        //"Assembly"="AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=71c72075855a359a"
        //"RuntimeVersion"="v4.0.30319"
        //"CodeBase"="file:///Drive:/Full/Image/Path/file.dll"
        SetInprocServer(InprocServer32.CreateSubKey("Version"), type, true);

        //[HKEY_CURRENT_USER\Software\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]
        keyCLSID.CreateSubKey(@"Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}");

        keyCLSID.Close();
    }

}

static void SetInprocServer(RegistryKey key, Type type, bool versionNode)
{

    if (!versionNode)
    {
        key.SetValue(null, "mscoree.dll");
        key.SetValue("ThreadingModel", "Both");
    }

    key.SetValue("Class", type.FullName);
    key.SetValue("Assembly", type.Assembly.FullName);
    key.SetValue("RuntimeVersion", type.Assembly.ImageRuntimeVersion);
    key.SetValue("CodeBase", type.Assembly.CodeBase);
}
  • 需要管理员权限
 public static bool RegCom(string path){
            Assembly asm = Assembly.LoadFile(path);
            RegistrationServices regAsm = new RegistrationServices();
bool  bResult=regAsm.RegisterAssembly(asm,AssemblyRegistrationFlags.SetCodeBase);
            return bResult;
        }

转载于:https://my.oschina.net/xfan/blog/2965716

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值