VSIX-nie można wczytać pliku lub złożenia odwołanej biblioteki dll

Moje pytanie jest bardzo podobne do tego , tyle że odpowiedź i obejście nie działają dla mnie. Również jestem w Visual Studio 2012.

Mam VSPackage, który odnosi się do innego projektu, który jest zależny od innych bibliotek DLL. Za każdym razem, gdy uruchamiam mój pakiet w debugowaniu, dostaję wyjątek, że inne biblioteki DLL nie mogą zostać znalezione. Znajdują się w katalogu wyjściowym i są podpisane.

Próbowałem odwoływać się do nich bezpośrednio przez projekt VSPackage do no / align = "left" /

Myśli?

Author: Community, 2012-12-03

1 answers

Ten problem istnieje, ponieważ Visual Studio nie szuka zestawów w folderze rozszerzenia, jeśli rozszerzenie nie ma wyraźnej zależności od tych zestawów. Na przykład zależności ustawione w pliku konfiguracyjnym (IOC config) lub w kodzie xaml. Znam trzy rozwiązania tego problemu:

  1. Możesz wdrożyć te zespoły w GAC, a program Visual Studio je załaduje. Ta metoda jest dobra, jeśli używasz biblioteki innej firmy, która została zbudowana do użytku w GAC (na przykład MS Enterprise Library). Ale VSIX Deployment Package nie pozwala na instalowanie zestawów w GAC, możesz użyć Instalatora MSI.

  2. Dla VSPackages dla Visual Studio 2010/2012 można użyć atrybutu ProvideBindingPath . Ścieżka, w której znajduje się rozszerzenie, zostanie dodana do ścieżek używanych przez Visual Studio do znajdowania zależnych złożeń. Jeśli Twoje rozszerzenie nie zawiera VSPackage, możesz dodać ten atrybut do dowolnej klasy publicznej (Zobacz tutaj ).

    [ProvideBindingPath] 
    public class MyVsPackage : Package 
    { /* ... */ }
    
  3. Można ręcznie rozwiązywać nazwy zespołów. Aby to zrobić, musisz zapisać się do zdarzenia AssemblyResolve i zwrócić wymagane zestawy z modułu obsługi. Jest to najbardziej elastyczny sposób, jeśli nie możesz użyć poprzednich metod, jest to specjalnie dla Ciebie.

    W moim projekcie IntelliDebugger napisałem dla niego podręcznik klasy Assemblyresolver:

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;
    }
}

Klasa ta musi zostać utworzona przed pierwszym wywołaniem problemu (np. w metodzie Package::initialize ())

 30
Author: Mikhail Shcherbakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-01 09:50:46