2009-06-09 2 views
3

Мы используем COM-DLL, предоставленную Microsoft (dsofile.dll) в C# dll, написанную нами (сборка A). Чтобы не регистрировать COM-dll, я переключил свойство Изолиния на ссылку на dsofile.dll на true.COM Interop, изоляция и исключение дубликатов ссылок

Это означает, что при компиляции нашей dll визуальная студия копирует dsofile.dll, Interop.DSOfile.dll и Native файлы манифеста в папки bin нашего решения, и приложение может работать без регистрации dsofile.dll.

Этот подход был успешным в небольшом тестовом приложении.

Однако в реальном приложении на сборку A ссылаются некоторые из наших других DLL (сборка B и сборка C) и приложение EXE. Когда собственный файл манифеста и interop dll копируются в папку bin приложения, используются разные копии каждого из файлов, поскольку каждая dll, ссылающаяся на нашу первую dll, создает свою собственную копию.

В результате получается несколько копий файлов, отображаемых в качестве ссылок в проекте установки (например, dsofile.dll из папок сборки A, B и C и EXE, Interop.DSOile.dll из сборки A, B и C и EXE-папки, Native.Assembly A.manifest из папок сборки A, B и C и EXE) и предупреждения компилятора («Два или несколько объектов имеют одно и то же целевое местоположение»).

Кроме того, если манифест и interop dll, которые были скопированы в конечную папку, не поступали непосредственно из папки Assembly A (поскольку дубликаты файлов перезаписываются друг с другом) приложение не может успешно загружать COM-DLL.

Я был вынужден вручную исключить дубликаты копий файлов из зависимостей установки, но они снова появляются, когда решение перезагружается или перестраивается.

Может ли кто-нибудь помочь с лучшим методом для изолированного развертывания COM-библиотеки dll? Я также хотел бы включить манифесты, если это было возможно, но пока не удалось добиться этого.

В качестве альтернативы я изучал автоматизацию задачи исключения дубликатов копий с использованием EnvDTE для автоматизации Visual Studio, но не смог узнать, как получить доступ к узлам обнаруженных зависимостей таким образом, чтобы я мог идентифицировать и исключить их. Доступ к ним с интерфейсом UIHierarchyItem показывает имя проекта установки как свойства имени для каждого файла и не имеет опции исключения.

Любые советы будут оценены.

ответ

2

Я решил аналогичную проблему в прошлом, ссылаясь на проекты, а не на сами сборки. В проекте развертывания есть некоторые проблемы с несколькими ссылками на сборки, которые встроены в решение.