You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:05:15