2015-07-06 10 views
5

Ho un'estensione per VS che dovrebbe utilizzare l'API di Gmail per inviare messaggi a determinati utenti nella mia azienda. Durante lo sviluppo passo ad un problema comune con la versione System.Net.Http.Primitives che è in qualche modo incasinata nelle API di Google.Come fare dll bindingRedirect in un'estensione Vsix?

Il common solution per questo è mettere bindingRedirect in app.config per reindirizzare tutte le chiamate a una nuova versione aggiornata della libreria. Come sotto:

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

Tuttavia, questo sembra non funzionare nel caso in cui il mio output è un pacchetto Vsix. Vsix generato non ha nemmeno un app.config.

Sono a conoscenza di una soluzione che dice di aggiungere bindingRedirect a machine.config file, ma le mie estensioni è usato da altre persone e non vorrei piuttosto costringerli a mettere roba nelle loro file di configurazione della macchina.

C'è un'altra soluzione per questo?

risposta

2

Tecnicamente, l'app.config appartiene al processo (.exe), non alle DLL. Per Visual Studio, è il file devenv.exe.config ubicato in C: \ Programmi (x86) \ Microsoft Visual Studio <versione> \ Common7 \ IDE.

Ma per modificare tale file l'estensione deve essere installata con diritti di amministratore (ovvero, .msi o tecnologia di installazione simile). E non penso che sia una buona idea modificare quel file dal momento che influenzerebbe altre estensioni.

Un approccio che si può provare è quello di reindirizzare vincolante per codice in qualche modo forzare un errore di risoluzione di assemblaggio, sottoscrivendo l'AppDomain.AssemblyResolveEvent, per avere la possibilità di fornire il montaggio esatto che si desidera. Vedi: http://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/

14

Risponde a un anno fa, ma ho trovato un modo migliore per farlo utilizzando ProvideBindingRedirectionAttribute. Ciò aggiungerà i reindirizzamenti dell'associazione a devenv e determinerà anche la versione corretta. Dettagli possono essere trovati here, ma la parte qui rilevante:

Utilizzando l'attributo ProvideBindingRedirection, è possibile specificare il reindirizzamento vincolanti per l'installazione di un aggiornamento ad un componente estensibile. Quando si spedisce un componente di Visual Studio estensibile, questo attributo impedisce agli utenti del componente di dover installare una versione precedente di un componente dipendente. Se si utilizza l'attributo ProvideBindingRedirection, non è necessario aggiornare manualmente il file exe.config per reindirizzare gli utenti della versione precedente dell'assembly alla nuova versione. L'aggiunta di un attributo di assembly ProvideBindingRedirection è un modo semplice per aggiungere una voce di reindirizzamento del binding al file pkgdef. Il file pkgdef viene utilizzato per installare l'estensione.

L'esempio seguente mostra una voce ProvideBindingRedirection nel file AssemblyInfo.cs o AssemblyInfo.vb:

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

Problemi correlati