VSIX-не удается загрузить файл или сборку библиотеки dll, на которую имеется ссылка
Мой вопрос очень похож на Этот, только ответ и обходной путь не работают для меня. Также я нахожусь в Visual Studio 2012.
У меня есть VSPackage, который ссылается на другой проект, который зависит от других библиотек DLL. Каждый раз, когда я запускаю свой пакет в debug, я получаю исключение, что другие библиотеки DLL не могут быть найдены. Они находятся в выходном каталоге и подписаны.
Я попробовал ссылаться на них напрямую в проекте VSPackage, чтобы нет выгода.
Мысли?
1 ответ:
Эта проблема возникает потому, что Visual Studio не ищет сборки в папке вашего расширения, если расширение не имеет явной зависимости от этих сборок. Например, зависимости, заданные в файле конфигурации (IOC config) или в коде xaml. Я знаю три решения этой проблемы:
Вы можете развернуть эти сборки в GAC, и Visual Studio загрузит их. Этот метод хорош, если вы используете стороннюю библиотеку, построенную для использования в GAC (например, MS Библиотека Предприятия). Но пакет развертывания VSIX не позволяет устанавливать сборки в GAC, вы можете использовать установщик MSI.
Для пакетов VSPackages для Visual Studio 2010/2012 можно использовать атрибут ProvideBindingPath. Путь, в котором находится расширение, будет добавлен к путям, используемым Visual Studio для поиска зависимых сборок. Если ваше расширение не содержит VSPackage, вы можете добавить этот атрибут в любой открытый класс (см. здесь ).
[ProvideBindingPath] public class MyVsPackage : Package { /* ... */ }
Можно вручную разрешить имена сборок. Для этого необходимо подписаться на событие AssemblyResolve и вернуть требуемые сборки из обработчика. Это самый гибкий способ, если вы не можете использовать предыдущие методы, это специально для вас.
В своем проекте IntelliDebugger я написал для него класс ManualAssemblyResolver:
using System; using System.Reflection; namespace IntelliEgg.Debugger.Utility { public class ManualAssemblyResolver : IDisposable { public ManualAssemblyResolver(Assembly assembly) { if (assembly == null) throw new ArgumentNullException("assembly"); _assemblies = new[] {assembly}; AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; } public ManualAssemblyResolver(params Assembly[] assemblies) { if (assemblies == null) throw new ArgumentNullException("assemblies"); if (assemblies.Length == 0) throw new ArgumentException("Assemblies should be not empty.", "assemblies"); _assemblies = assemblies; AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; } public void Dispose() { AppDomain.CurrentDomain.AssemblyResolve -= OnAssemblyResolve; } private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { foreach (Assembly assembly in _assemblies) { if (args.Name == assembly.FullName) { return assembly; } } return null; } private readonly Assembly[] _assemblies; } }
Этот класс должен быть создан до первого вызова сборки задачи (например, в пакете:: Initialize () метод)