Почему среда выполнения не разрешает мою сборочную зависимость автоматически? - PullRequest
0 голосов
/ 05 февраля 2010

У меня есть некоторый код на C ++, который является оснасткой для приложения на основе MMC. Эта оснастка использует dll .net 2.0 через оболочку COM (AssemblyA). AssemblyA находится в том же каталоге, что и приложение, запускающее сеанс MMC. AssemblyA использует некоторые другие библиотеки .net (OtherAssemblies), которые по независящим от меня причинам не могут находиться в том же каталоге, что и AssemblyA. Он также позволяет динамически загружать некоторые компоненты (из AssemblyB) и ищет их в третьем каталоге. Динамические компоненты из AssemblyB ссылаются на AssemblyA, поскольку они расширяют базовый класс.

Моя проблема в том, что когда я пытаюсь загрузить динамический компонент, он не может разрешить зависимость от AssemblyA, и мой обработчик AssemblyResolve запускается (который я использовал для разрешения OtherAssemblies). Когда я запрашиваю Assembly.GetExecutingAssembly () в обработчике AssemblyResolve, сборка - это сборка, которую я пытаюсь разрешить.

Это поведение кажется мне немного странным, так как я ожидал, что среда выполнения .NET будет сначала искать зависимости в загруженных сборках, затем локально для загружаемой сборки, а затем в каталоге приложения. Первый и третий из них должны содержать сборку, которую я пытаюсь загрузить.

Я изменил свой метод AssemblyResolve, чтобы он искал зависимости в других местах, чтобы он работал, как в текущем каталоге приложения, но я не очень хочу этого делать, если смогу помочь.

Ожидается ли такое поведение? Это из-за того, что оно является приложением MMC или из-за того, что оно запускается из COM, вызываемого из C ++? Я дурак?

1 Ответ

2 голосов
/ 05 февраля 2010

Это и то и другое. Тот факт, что вы используете MMC, затрудняет разрешение сборок в .NET, но он не будет найден в каталоге c: \ windows \ system32. Вы не можете разумно решить эту проблему с помощью файла .config для MMC, это может испортить любые будущие плагины.

COM тоже не помогает, каталог, в который вы поместили COM DLL, никак не влияет на путь зондирования. Вы уже нашли один способ решить эту проблему, AssemblyResolve. Или вы можете поместить все в GAC.

Или вы можете избежать использования COM и писать подключаемые модули MMC напрямую с пространством имен Microsoft.ManagementConsole .

...