我们在自己编写的C#动态链接库(程序集A)中使用微软(dsofile.dll)提供的COM动态链接库。为了避免注册COM,我已经将引用dsofile.dll上的Isolated属性切换为true。
这意味着当我们编译dll时,visual studio会将dsofile.dll、Interop.DSOfile.dll和本机清单文件复制到解决方案的bin文件夹中,并且应用程序可以在没有注册dsofile.dll的情况下运行。
这种方法在一个小型测试应用程序中取得了成功。
但是,在实际应用程序中,程序集A被我们的一些其他dll(程序集B和程序集C)和应用程序EXE引用。将本机清单文件和互操作dll复制到应用程序的bin文件夹中时,将使用每个文件的不同副本,因为引用第一个dll的每个dll都会创建自己的副本。
这会导致文件的多个副本在安装项目中显示为引用(即来自程序集A、B和C和EXE文件夹的dsofile.dll,来自程序集A、B和C和EXE文件夹的Interop.DSOFile.dll,来自程序集A、B和C和EXE文件夹的Native.Assembly A.manifest )以及编译器警告(“两个或更多对象具有相同的目标位置”)。
此外,如果复制到最终文件夹中的清单和互操作DLL不是直接来自程序集A文件夹(因为重复的文件相互覆盖),则应用程序无法成功加载COM dll。
我被迫从安装依赖项中手动排除重复的文件副本,但当重新加载或重新构建解决方案时,它们会重新出现。
是否有人可以提供更好的方法来实现COM dll的独立部署?如果可能的话,我也想嵌入清单,但到目前为止,我还没有成功做到这一点。
作为另一种选择,我一直在研究使用EnvDTE for Visual Studio automation排除重复副本的任务的自动化,但还没有发现如何以一种允许我识别和排除它们的方式访问检测到的依赖项节点。使用UIHierarchyItem接口访问它们时,会将安装项目的名称显示为每个文件的name属性,并且没有排除选项。
任何建议都将不胜感激。
发布于 2009-10-22 01:37:09
我过去通过引用项目而不是程序集本身解决了类似的问题。deploy项目对解决方案中正在生成的程序集的多个引用存在一些问题。
https://stackoverflow.com/questions/968689
复制相似问题