运行时引用库未找到: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
相关产品推荐
相关产品推荐

