加载插件的方式一般有两种
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版本的加载器,不过这点我没有测试...