Мы используем COM DLL, предоставленную Microsoft (dsofile.dll), в C # dll, написанном нами (сборка A). Чтобы избежать необходимости регистрировать COM DLL, я изменил свойство Isolated для ссылки на dsofile.dll на true.
Это означает, что когда мы компилируем нашу dll, Visual Studio копирует файлы dsofile.dll, Interop.DSOfile.dll и Native manifest в папки bin нашего решения, и приложение может работать без регистрации dsofile.dll.
Этот подход был успешным в небольшом тестовом приложении.
Однако в реальном приложении на сборку A ссылаются некоторые другие наши библиотеки (сборка B и сборка C) и EXE-файл приложения. Когда собственный файл манифеста и dll-файл взаимодействия копируются в папку bin приложения, используются разные копии каждого из файлов, поскольку каждая dll, ссылающаяся на нашу первую dll, создает свою собственную копию.
Это приводит к тому, что несколько копий файлов отображаются в виде ссылок в проекте установки (например, dsofile.dll из папок сборки A, B и C и EXE, Interop.DSOFile.dll из сборки A, B и C и Папки EXE, Native.Assembly A.manifest из папок Assembly A, B и C и EXE) и предупреждения компилятора («Два или более объекта имеют одинаковое целевое расположение»).
Кроме того, если dll манифеста и взаимодействия, которые были скопированы в конечную папку, не были получены непосредственно из папки Assembly A (поскольку дубликаты файлов перезаписывают друг друга), приложение не может успешно загрузить COM DLL.
Я был вынужден вручную исключить дубликаты копий файлов из зависимостей установки, но они снова появляются, когда решение перезагружается или перестраивается.
Может кто-нибудь помочь с лучшим методом для достижения изолированного развертывания COM DLL? Я также хотел бы встроить манифесты, если это возможно, но пока мне это не удалось.
В качестве альтернативы я исследовал автоматизацию задачи исключения дубликатов с помощью EnvDTE для Visual Studio Automation, но не смог выяснить, как получить доступ к узлам Обнаруженные зависимости таким образом, который позволяет мне идентифицировать и исключать их. Доступ к ним с помощью интерфейса UIHierarchyItem показывает имя проекта установки в качестве свойства имени для каждого файла и не имеет параметра исключения.
Любой совет будет оценен.