COM Interop, изоляция и исключение дубликатов ссылок - PullRequest
3 голосов
/ 09 июня 2009

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

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

1 Ответ

2 голосов
/ 21 октября 2009

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

...