我使用的是Add-in Manager 是这个开源项目
项目逻辑
- 项目采取的办法是通过加载
RevitAddinManage
这个dll,并在文件中动态加载用户的测试dll从而达到快速加载,快速测试的目的 - 通过这种办法可以将多个程序附加到revit中并进行测试
问题点
- 我有一个测试文件叫做
RevitTest
,我的主要的工作文件为A
,A.UI
,A.API
, 如果我将A的一个方法加载到测试文件中通过附着Add-in 进行测试,那么会出现 A更新之后无法依赖正确项的问题,必须重启才可以完成测试。下图可以看到多次测试会动态加载多个dll,这个是我修正之后的情况,修正之前XGZ_Tool
只能依赖最早的一般,问题就出现在这里
Assembly.Load()
在具体了解解决办法之前,先了解一下Assembly.Load() , 通过这个函数可以动态加载我们需要的dll也就是add-in的关键函数,Load有三个函数
- Load()函数需要将dll的强名称传入进来,类似格式为
System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- LoadFrom() 将会根据文件路径加载,如果遇到同名的文件将会放弃加载,继续使用旧版本,可以看到下面两个图依赖的
XGZ_Tool
版本号一致,但是最新的版本号是1.0.0.84
- LoadFile() 将会根据文件路径加载,但是不考虑重复名称等条件,直接加载,但是无法加载他的依赖项,还需要将依赖项逐步加载进来。此处就是我的问题的原因,因为Add-In只加载测试文件,所以依赖项只在第一次调用时会触发缺项的机制从而引入,后续所有的添加依赖项,程序会首先在Runtime中查找是否有同名版本,由于我的版本号一直是1.0.0.0,程序默认无更改无需载入新的同名文件,导致我的XGZ_Tool更新后,运行无法更新
解决办法
根据上面的分析,解决办法可以有两个 :
- 修改程序文件的版本号,将版本号修改为自增版本,这样调用LoadFile()函数将会根据RevitTest的依赖版本进行自动添加
<PropertyGroup>
<Version>$(RevitVersion)</Version>
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
<Description>A Peoject for Developer in Revit</Description>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<PublishSingleFile>true</PublishSingleFile>
<TargetFramework>net472</TargetFramework>
<VersionSuffix>1.0.0.$([System.DateTime]::UtcNow.ToString(mmff))</VersionSuffix>
<AssemblyVersion Condition="'$(VersionSuffix)' == ''">0.0.0.1</AssemblyVersion>
<AssemblyVersion Condition=" '$(VersionSuffix)' != '' ">$(VersionSuffix)</AssemblyVersion>
<Company>XGZ</Company>
<Authors>XGZ_Xu</Authors>
</PropertyGroup>
- 由于前面讲过RevitAddin的机制,所以如果是公司团队使用可以根据上面你的原理做一个自己的Add-in , 这样就可以更加灵活的使用。