COM Interop,隔离和排除重复引用

时间:2009-06-09 07:40:01

标签: c# visual-studio automation com-interop setup-project

我们正在使用Microsoft提供的COM DLL(dsofile.dll)在我们编写的C#dll中(程序集A)。为了避免必须注册COM dll,我已将dsofile.dll引用上的Isolated属性切换为true。

这意味着当我们编译我们的dll时,visual studio会将dsofile.dll,Interop.DSOfile.dll和Native清单文件复制到我们解决方案的bin文件夹中,并且应用程序可以在不注册dsofile.dll的情况下运行。

这种方法在小型测试应用中取得了成功。

但是,在实际应用程序中,程序集A由我们的一些其他dll(程序集B和程序集C)和应用程序EXE引用。当本机清单文件和interop dll被复制到应用程序的bin文件夹时,正在使用每个文件的不同副本,因为每个引用我们的第一个dll的dll都会创建自己的副本。

这会导致文件的多个副本在安装项目中显示为引用(即程序集A,B和C以及EXE文件夹中的dsofile.dll,程序集A,B和C中的Interop.DSOFile.dll以及EXE文件夹,Native.Assembly A.manifest来自程序集A,B和C和EXE文件夹)和编译器警告('两个或多个对象具有相同的目标位置')。

此外,如果复制到最终文件夹中的清单和interop dll没有直接来自Assembly A文件夹(因为重复文件会相互覆盖),则应用程序无法成功加载COM DLL。

我被迫手动从设置依赖项中排除文件的重复内容,但是在重新加载或重建解决方案时它们会重新出现。

任何人都可以帮助更好的方法来实现COM dll的隔离部署吗?如果可能的话,我也想嵌入清单,但到目前为止我还没有成功。

作为替代方案,我一直在调查使用EnvDTE for Visual Studio Automation排除重复副本的任务的自动化,但是无法以允许我识别和排除的方式发现如何访问Detected Dependencies节点他们。使用UIHierarchyItem接口访问它们会将安装项目的名称显示为每个文件的name属性,并且没有排除选项。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

我过去通过引用项目而不是程序集本身来解决类似的问题。部署项目存在一些问题,即对解决方案中构建的程序集进行多次引用。