Revit 2018插件因Xceed版本冲突触发TypeLoadException求助
我最近碰到一个特别挠头的问题,和同事琢磨了好久都没搞明白:我们用.NET C#开发了Autodesk Revit 2018的第三方插件,插件和Revit主程序都引用了Xceed.AvalonDock.dll,但版本不一样——插件用的是3.2.0版本,Revit自带的是2.0.0版本。现在部分客户端启动插件时会触发TypeLoadException异常。
以下是项目对Xceed的引用配置(摘自项目的
.csproj文件):<Reference Include="Xceed.AvalonDock, Version=3.2.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL"> <HintPath>..\packages\Xceed.Wpf.AvalonDock.3.2.0\lib\net45\Xceed.AvalonDock.dll</HintPath> <Private>True</Private> </Reference>
可行的解决方案参考
绑定重定向强制加载指定版本:在插件的配置文件(比如
YourPluginName.dll.config)中添加绑定重定向规则,告诉CLR优先加载插件依赖的3.2.0版本,忽略Revit的2.0.0版本。配置示例如下:<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Xceed.AvalonDock" publicKeyToken="3e4669d2f30244f4" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.2.0.0" newVersion="3.2.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> 要注意把这个配置文件和插件的dll放在同一目录,同时确认Revit的插件加载机制会读取这个配置(少数情况下可能需要通过代码辅助加载)。嵌入程序集隔离依赖:使用ILMerge或者Visual Studio的嵌入资源功能,把
Xceed.AvalonDock.dll嵌入到插件的主程序集里。这样插件运行时会直接调用嵌入的版本,完全和Revit的依赖版本隔离开。不过要留意组件的版权条款,以及嵌入后可能带来的程序集体积增大问题。确认私有部署配置:检查项目引用中的
<Private>True</Private>是否正确设置——这个标记会让构建时把依赖的dll复制到插件输出目录,确保插件启动时能优先找到自己的版本。如果Revit还是优先加载自身目录的dll,就需要结合绑定重定向来覆盖加载逻辑。排查客户端环境差异:既然只有部分客户端出问题,建议检查这些客户端的Revit是否同时安装了其他引用Xceed组件的插件,或者系统GAC(全局程序集缓存)中是否存在
Xceed.AvalonDock.dll的特定版本,导致CLR加载优先级发生了变化。
内容的提问来源于stack exchange,提问作者Levente Koncz

