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

运行时引用库未找到:Revit C#多项目部署问题求助

解决Revit主DLL依赖子类库的部署问题

这在Revit插件开发里是个非常典型的依赖加载问题,我来分享几个经过实践验证的解决方案,帮你简化部署流程:

1. 将子DLL嵌入主DLL作为嵌入式资源

这是最彻底的解决方案,直接把依赖的子DLL打包进主DLL里,部署时只需要发布单个文件。

操作步骤:

  • 打开子类库项目的属性窗口,切换到生成标签页,点击输出下方的高级按钮保持输出类型为类库;随后在项目的资源标签页,点击添加资源→添加现有文件,选择编译好的子DLL(或者直接在解决方案资源管理器里把子DLL文件的生成操作设置为嵌入的资源)。
  • 在主项目的入口类(比如实现IExternalApplication的类)中添加AssemblyResolve事件处理,当Revit加载主DLL找不到依赖时,从嵌入资源中读取并加载:
using System.Reflection;
using Autodesk.Revit.UI;

namespace YourRevitPlugin
{
    public class App : IExternalApplication
    {
        static App()
        {
            // 注册程序集解析事件
            AppDomain.CurrentDomain.AssemblyResolve += ResolveEmbeddedAssembly;
        }

        private static Assembly ResolveEmbeddedAssembly(object sender, ResolveEventArgs args)
        {
            var assemblyName = new AssemblyName(args.Name).Name;
            // 资源路径格式:主项目命名空间.资源文件夹名.子DLL文件名(无资源文件夹则为主项目命名空间.子DLL文件名)
            var resourcePath = $"YourRevitPlugin.Resources.{assemblyName}.dll";
            
            using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourcePath);
            if (stream == null) return null;

            var assemblyBytes = new byte[stream.Length];
            stream.Read(assemblyBytes, 0, assemblyBytes.Length);
            return Assembly.Load(assemblyBytes);
        }

        public Result OnStartup(UIControlledApplication application)
        {
            // 你的插件初始化逻辑
            return Result.Succeeded;
        }

        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }
    }
}

2. 利用Revit的默认搜索路径统一部署

Revit启动时会自动扫描几个固定目录加载插件和依赖,你可以把主、子DLL放到这些目录里,避免手动指定路径。

常用的搜索路径:

  • Revit AddIn目录:C:\ProgramData\Autodesk\Revit\Addins\{你的Revit版本号}(比如C:\ProgramData\Autodesk\Revit\Addins\2024)。你可以在这个目录下创建专属插件文件夹,把主DLL和子DLL都放进去,然后在AddIn manifest文件(.addin)里指定主DLL的相对路径:
<Assembly>YourPluginFolder\YourMainPlugin.dll</Assembly>
  • 如果你有权限,也可以把依赖DLL放到Revit安装目录(比如C:\Program Files\Autodesk\Revit 2024),但不推荐这种方式——不仅可能遇到权限问题,Revit版本更新后还需要重新部署。

3. 使用DLL合并工具自动打包

借助第三方工具把主DLL和子DLL合并成单个文件,编译时自动完成打包,部署时直接发布合并后的文件。

推荐工具:

  • Costura.Fody:这是最易用的NuGet包,安装后无需额外配置,编译时自动将所有依赖DLL合并到主DLL中。
    操作:在主项目的NuGet包管理器中搜索并安装Costura.Fody,重新编译主项目后,输出目录里的主DLL就已经包含了子DLL的所有代码。
  • ILMerge:微软官方的命令行工具,适合需要更精细控制合并逻辑的场景。你可以编写批处理脚本或者在VS的生成事件中添加命令,将主DLL和子DLL合并:
ILMerge.exe /out:MergedPlugin.dll YourMainPlugin.dll YourSubLibrary.dll

内容的提问来源于stack exchange,提问作者Paul Gibson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:56:08