2015-07-06 50 views
5

Mam rozszerzenie do usługi VS, które powinno używać interfejsu API Gmaila do wysyłania wiadomości e-mail do niektórych użytkowników w mojej firmie. Podczas prac rozwojowych przechodzę do wspólnego problemu z wersją System.Net.Http.Primitives, która jest w jakiś sposób pomieszana w interfejsie API Google.Jak zrobić powiązanie dllRedirect w rozszerzeniu Vsix?

W tym celu należy umieścić bindingRedirect w pliku app.config, aby przekierować połączenia do nowej, zaktualizowanej wersji biblioteki. Jak poniżej:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
     <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Jednak wydaje się, że to nie działa, gdy moje wyjście jest pakietem Vsix. Wygenerowany Vsix nie ma nawet app.config.

Jestem świadomy rozwiązania, które mówi, aby dodać plik bindingRedirect do machine.config, ale moje rozszerzenia są używane przez inne osoby i wolałbym nie zmuszać ich do umieszczania rzeczy w swoich plikach konfiguracyjnych komputera.

Czy istnieje inne rozwiązanie tego problemu?

Odpowiedz

2

Technicznie, app.config należy do procesu (.exe), a nie do bibliotek dll. W przypadku Visual Studio jest to plik devenv.exe.config znajdujący się w C: \ Program Files (x86) \ Microsoft Visual Studio <wersja> \ Common7 \ IDE.

Ale aby zmodyfikować ten plik, twoje rozszerzenie powinno być zainstalowane z uprawnieniami administratora (czyli .msi lub podobną technologią instalatora). Nie wydaje mi się, że warto zmodyfikować ten plik, ponieważ wpłynie to na inne rozszerzenia.

Jednym z podejść, które można spróbować, jest przekierowanie wiązania za pomocą kodu, w jakiś sposób wymuszenie niepowodzenia rozdzielczości zespołu, zasubskrybowanie AppDomain.AssemblyResolveEvent, aby uzyskać szansę dostarczenia dokładnego zestawu, który chcesz. Zobacz: http://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/

14

Odpowiedź została udzielona ponad rok temu, ale znalazłem lepszy sposób na zrobienie tego przy użyciu ProvideBindingRedirectionAttribute. Spowoduje to dodanie wiążących przekierowań do devenv, a także określenie właściwej wersji. Szczegóły można znaleźć here, ale odpowiednia część tutaj:

Za pomocą atrybutu ProvideBindingRedirection można określić wiązania przekierowanie do instalacji uaktualnienia do rozszerzalny składnik. Po wysłaniu rozszerzalnego komponentu Visual Studio ten atrybut uniemożliwia użytkownikom komponentu instalowanie starej wersji komponentu zależnego. W przypadku użycia atrybutu ProvideBindingRedirection nie trzeba ręcznie aktualizować pliku exe.config, aby przekierowywać użytkowników starej wersji zespołu do nowej wersji. Dodawanie atrybutu assembly ProvideBindingRedirection jest łatwym sposobem dodania do pliku pkgdef pozycji przekierowania wiązania. Plik pkgdef służy do zainstalowania rozszerzenia.

Poniższy przykład pokazuje pozycję ProvideBindingRedirection w pliku AssemblyInfo.cs lub AssemblyInfo.vb:

[assembly: ProvideBindingRedirection(AssemblyName = "ClassLibrary1", NewVersion = "3.0.0.0", OldVersionLowerBound = "1.0.0.0", OldVersionUpperBound = "2.0.0.0")]