Ответ 1
Эта проблема существует, потому что Visual Studio не ищет сборки в папке вашего расширения, если ваше расширение не имеет явной зависимости от этих сборок. Например, зависимости, установленные в файле конфигурации (IoC config) или в коде xaml. Я знаю три решения этой проблемы:
-
Вы можете развернуть эти сборки в GAC, и Visual Studio загрузит их. Этот метод хорош, если вы используете стороннюю библиотеку, созданную для использования в GAC (например, MS Enterprise Library). Но Пакет развертывания 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;
}
}
Этот класс должен быть создан до первого вызова сборки проблемы (например, в методе Package:: Initialize())