我们在我们编写的 C# dll (Assembly A) 中使用 Microsoft 提供的 COM DLL (dsofile.dll)。为了避免注册 COM dll,我已将 dsofile.dll 引用上的独立属性切换为 true。
这意味着当我们编译我们的 dll 时,Visual Studio 会将 dsofile.dll、Interop.DSOfile.dll 和 Native manifest 文件复制到我们解决方案的 bin 文件夹中,并且应用程序可以在没有注册 dsofile.dll 的情况下运行。
这种方法在一个小型测试应用程序中是成功的。
然而,在实际应用程序中,程序集 A 被我们的一些其他 dll(程序集 B 和程序集 C)和应用程序 EXE 引用。当本机清单文件和互操作 dll 被复制到应用程序的 bin 文件夹时,每个文件的不同副本被使用,因为每个引用我们的第一个 dll 的 dll 都会创建自己的副本。
这会导致文件的多个副本显示为安装项目中的引用(即来自 Assembly A、B 和 C 以及 EXE 文件夹的 dsofile.dll,来自 Assembly A、B 和 C 以及 EXE 文件夹的 Interop.DSOFile.dll, Native.Assembly A.manifest 来自 Assembly A、B 和 C 以及 EXE 文件夹)和编译器警告(“两个或多个对象具有相同的目标位置”)。
此外,如果复制到最终文件夹中的 manifest 和 interop dll 不是直接来自 Assembly A 文件夹(因为重复文件相互覆盖),则应用程序无法成功加载 COM DLL。
我被迫从设置依赖项中手动排除文件的重复副本,但是当重新加载或重建解决方案时它们会重新出现。
谁能提供更好的方法来实现 COM dll 的隔离部署?如果可能的话,我还想嵌入清单,但到目前为止我还没有成功。
作为替代方案,我一直在研究使用 EnvDTE for Visual Studio Automation 排除重复副本的任务的自动化,但无法发现如何以允许我识别和排除它们的方式访问检测到的依赖项节点。使用 UIHierarchyItem 界面访问它们会将安装项目的名称显示为每个文件的名称属性,并且没有排除选项。
任何意见,将不胜感激。