解决打开Revit时提示未签名的附加模块

总体思路:

      1、自己创建证书,在安装插件时,调用注册证书。

      2、给入口的dll添加签名

一、创建证书

在vs安装目录下找到Visual Studio Tools文件夹下的Developer PowerShell for VS 2019工具进行创建,或 打开vs,在工具-->命令行-->开发者PowerShel中启动命令窗口

PS C:\Users\Administrator\source\repos> makecert -n "CN=CommonRoot" -r -sv D:\001Test\common.pvk D:\001Test\common.cer
Succeeded
PS C:\Users\Administrator\source\repos> pvk2pfx -pvk D:\001Test\common.pvk -spc D:\001Test\common.cer -pfx D:\001Test\common.pfx -pi common

创建完成后,有两个文件使用到,一个为.cer,一个为.pfx,其中.cer为安装包安装时调用注册证书使用,.pfx为给dll签名时使用,需要记住在创建证书时的密码,在签名时需要用上

二、创建一个控制台项目,用于注册证书(注意不要直接双击安装.cer文件,因为直接安装,不会添加到受信任证书中,所以需要通过以下代码进行安装

  注意修改代码中的以下内容

        “RegisterCert.exe”替换为当前控制台程序,

        “for_revit.cer”换为生成的.cer名称,

        “CN=公司名称ForRevit”替换为创建证书时输入的名字

using System;
using System.Security.Cryptography.X509Certificates;

namespace RegisterCert
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
                System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
                //判断当前登录用户是否为管理员 
                if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
                {
                    //如果是管理员,则直接运行 
                    Run();
                }
                else
                {
                    //创建启动对象 
                    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                    //设置运行文件 
                    startInfo.FileName = Environment.CurrentDirectory + @"\RegisterCert.exe";
                    //设置启动参数 
                    //设置启动动作,确保以管理员身份运行 
                    startInfo.Verb = "runas";
                    //如果不是管理员,则启动UAC 
                    System.Diagnostics.Process.Start(startInfo);
                }
            }
            catch
            {
            }
        }

        static void Run()
        {
            var certificate = new X509Certificate2(Environment.CurrentDirectory + @"\for_revit.cer");
            if (!CheckCert())
            {
                X509Store store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
                try
                {
                    store.Open(OpenFlags.ReadWrite);
                    store.Add(certificate);
                }
                finally
                {
                    store.Close();
                }
            }
            if (!CheckCert2())
            {
                var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
                try
                {
                    store.Open(OpenFlags.ReadWrite);
                    store.Add(certificate);
                }
                finally
                {
                    store.Close();
                }
            }
        }

        /// <summary>
        /// 检测是否存在指定的证书
        /// </summary>
        /// <returns></returns>
        static bool CheckCert()
        {
            bool result = false;
            X509Store store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
            try
            {
                store.Open(OpenFlags.ReadWrite);
                foreach (var item in store.Certificates)
                {
                    if (item.SubjectName.Name == "CN=公司名称ForRevit")
                    {
                        result = true;
                    }
                }
            }
            finally
            {
                store.Close();
            }
            return result;
        }

        static bool CheckCert2()
        {
            bool result = false;
            X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
            try
            {
                store.Open(OpenFlags.ReadWrite);
                foreach (var item in store.Certificates)
                {
                    if (item.SubjectName.Name == "CN=公司名称ForRevit")
                    {
                        result = true;
                    }
                }
            }
            finally
            {
                store.Close();
            }
            return result;
        }
    }
}

三、给dll添加签名

signtool sign /fd SHA256 /f D:\001Test\common.pfx /p common "D:\001Test\test.dll"

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值