Мы используем 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 показывает имя проекта установки как свойства имени для каждого файла и не имеет опции исключения.
Любые советы будут оценены.