VSIX - невозможно загрузить файл или сборку связанной DLL - программирование
Подтвердить что ты не робот

VSIX - невозможно загрузить файл или сборку связанной DLL

Мой вопрос очень похож на на этот, только тот ответ и работа вокруг меня не работают. Также я нахожусь в Visual Studio 2012.

У меня есть VSPackage, который ссылается на другой проект, который зависит от других DLL. Каждый раз, когда я запускаю свой пакет в отладке, я получаю исключение, которое нельзя найти в других dll. Они находятся в выходном каталоге, и они подписаны.

Я попытался ссылаться на них напрямую проектом VSPackage безрезультатно.

Мысли?

4b9b3361

Ответ 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())