Revit二次开发 - 插件更新升级

加载插件的方式一般有两种

1、通过自己做的一个壳程序(.exe)再启动revit加载插件

2、打开Revit就自动加载插件

第一种方式的升级操作很好办到的,因为在启动Revit之间,你是知道Revit的插件是否需要更新,如需更新,直接从服务器下载覆盖即可,不存在动态库被占用的情况;

而第二种方式,在加载你的插件后,需要更新的相关库可能已经被加载revit环境中了,这时覆盖可能会提示被占用的异常。

这时就需要把你的库调整下结构了(可作参考):

addin文件指向加载器"WXVisual.Revit.Loader.dll",因为revit多版本需要分别编译的问题,所以:

与revit有关的库都分文件夹存放,由加载器加载对应的revit相关的库文件;

公共库放在lib文件夹中,所有revit库使用lib中的公共库;

那么问题来了,插件怎么才能找到对应revit版本的库和lib文件夹中的库呢?

AssemblyResolve 事件会在系统解析库且找不到库是被触发(官方解释:在对程序集的解析失败时发生),这时你就可以加载指定目录下的文件了,类似如下操作:

//可以在Onstart事件中注册
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
       {
            var strArray = args.Name.Split(',');
            var asmName = strArray[0];
            if (strArray.Length > 1)
            {
                string str2 = strArray[1];
                if (asmName.EndsWith(".resources", StringComparison.CurrentCultureIgnoreCase)
                    && !str2.EndsWith("neutral", StringComparison.CurrentCultureIgnoreCase))
                    return null;
            }

            var dllName = asmName + ".dll";

            return LoadAssemblyFromResource(dllName);
}

加载器WXVisual.Revit.Loader,它主要功能是加载正确版本的revit库和更新升级的操作,迭代几个版本它会非常稳定的,所有无需更新它;

更重要的是,它与其他的库没有直接依赖的关系,都是通过动态加载和反射的方式操作;

不同版本的revit可能都能同时使用v4.5net版本的加载器,不过这点我没有测试...

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页