Revit设计自动化(DA4R)中Microsoft.Bcl.AsyncInterfaces程序集解析问题
Revit设计自动化(DA4R)程序集版本冲突解决方案
问题背景
使用DA4R基于CSV修改族参数时,遇到Microsoft.Bcl.AsyncInterfaces版本冲突:CSV库依赖v1.0.0.0+,JSON库依赖v7.0.0.0。AppBundle只能打包一个版本,无论选哪个都会抛出文件未找到异常:
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.
本地通过app.config绑定重定向解决,但DA4R环境无法使用该文件。考虑自定义程序集解析函数,但不知道如何动态获取AppBundle程序集位置(不想硬编码临时路径)。
解决方案
1. 自定义程序集解析函数的思路完全可行,且是DA4R环境下的常规方案
你不需要硬编码临时路径,可以通过以下方式动态获取AppBundle解压后的程序集目录:
- 使用
Assembly.GetExecutingAssembly().Location获取当前插件程序集的路径,这个路径就是AppBundle解压后的目录下的程序集路径。 - 基于这个路径,你可以定位到同目录下打包的
Microsoft.Bcl.AsyncInterfaces.dll文件(比如你选择打包v7.0.0.0版本)。
示例代码:
// 在程序启动时注册解析事件 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { // 检查是否是目标程序集 if (args.Name.StartsWith("Microsoft.Bcl.AsyncInterfaces,")) { // 获取当前程序集所在目录 string currentAssemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(currentAssemblyPath); // 拼接目标程序集路径(这里假设打包的是v7.0.0.0版本) string targetAssemblyPath = Path.Combine(assemblyDir, "Microsoft.Bcl.AsyncInterfaces.dll"); if (File.Exists(targetAssemblyPath)) { return Assembly.LoadFrom(targetAssemblyPath); } } return null; }
2. 更简便的替代方案:代码实现绑定重定向
除了自定义解析函数,还可以通过代码实现绑定重定向逻辑,无需额外处理路径:
// 在程序初始化时添加绑定重定向规则 var redirects = new Dictionary<string, Version> { {"Microsoft.Bcl.AsyncInterfaces", new Version(7, 0, 0, 0)} }; AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name); if (redirects.TryGetValue(assemblyName.Name, out var targetVersion)) { assemblyName.Version = targetVersion; return Assembly.Load(assemblyName); } return null; };
3. 终极方案:合并程序集
使用工具(如ILMerge、Costura.Fody)将Microsoft.Bcl.AsyncInterfaces合并到你的主程序集中,彻底消除版本冲突。注意提前确认依赖库的许可协议是否允许合并操作。
内容的提问来源于stack exchange,提问作者Blake Hageman
相关产品推荐
相关产品推荐

