risposta

2

Oggi non è possibile, ma stiamo pensando a come raggiungerlo. Puoi aprire un problema su https://github.com/Azure/azure-webjobs-sdk-script/issues per assicurarti che il tuo scenario specifico sia visto? Grazie!

+1

nuovo problema correlato: Fornire redirect vincolante per CSX caricamento multiplo dll # 1239 https://github.com/Azure/azure-webjobs-sdk-script/issues/1239 –

8

Supponendo che si sta utilizzando l'ultima (June'17) Visual Studio 2017 Funzione Tooling, ho derivato una soluzione di configurazione basata su un po ', ragionevole per questo a seguito di un frammento di codice inviato da npiasecki Oltre Issue #992.

Sarebbe ideale se questo fosse gestito attraverso il framework, ma almeno essendo guidato dalla configurazione si ha un po 'più di isolamento dei cambiamenti. Suppongo che potresti anche usare alcuni passi pre-compilazione o un template T4 che riconcilia le versioni degli nugets nel progetto (e le loro dipendenze) prima di scrivere questa configurazione o generare codice.

Così il rovescio della medaglia ..

.. diventa dover ricordare di aggiornare il BindingRedirects config quando si aggiorna il pacchetto NuGet (questo è spesso un problema in ogni caso app.configs). È inoltre possibile che si verifichi un problema con la soluzione guidata dalla configurazione se è necessario reindirizzare Newtonsoft.

Nel nostro caso, stavamo utilizzando il nuovo NuGet di Azure Fluent che dipendeva da una versione precedente di Microsoft.IdentityModel.Clients.ActiveDirectory rispetto alla versione delle normali librerie di gestione ARM che vengono utilizzate affiancate in una particolare funzione.

local.settings.json
{ 
    "IsEncrypted": false, 
    "Values": { 
     "BindingRedirects": "[ { \"ShortName\": \"Microsoft.IdentityModel.Clients.ActiveDirectory\", \"RedirectToVersion\": \"3.13.9.1126\", \"PublicKeyToken\": \"31bf3856ad364e35\" } ]" 
    } 
} 
FunctionUtilities.cs
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using System; 
using System.Globalization; 
using System.Linq; 
using System.Reflection; 

namespace Rackspace.AzureFunctions 
{ 
    public static class FunctionUtilities 
     { 
      public class BindingRedirect 
      { 
       public string ShortName { get; set; } 
       public string PublicKeyToken { get; set; } 
       public string RedirectToVersion { get; set; } 
      } 

      public static void ConfigureBindingRedirects() 
      { 
       var config = Environment.GetEnvironmentVariable("BindingRedirects"); 
       var redirects = JsonConvert.DeserializeObject<List<BindingRedirect>>(config); 
       redirects.ForEach(RedirectAssembly); 
      } 

      public static void RedirectAssembly(BindingRedirect bindingRedirect) 
      { 
       ResolveEventHandler handler = null; 

       handler = (sender, args) => 
       { 
        var requestedAssembly = new AssemblyName(args.Name); 

        if (requestedAssembly.Name != bindingRedirect.ShortName) 
        { 
         return null; 
        } 

        var targetPublicKeyToken = new AssemblyName("x, PublicKeyToken=" + bindingRedirect.PublicKeyToken) 
         .GetPublicKeyToken(); 
        requestedAssembly.Version = new Version(bindingRedirect.RedirectToVersion); 
        requestedAssembly.SetPublicKeyToken(targetPublicKeyToken); 
        requestedAssembly.CultureInfo = CultureInfo.InvariantCulture; 

        AppDomain.CurrentDomain.AssemblyResolve -= handler; 

        return Assembly.Load(requestedAssembly); 
       }; 

       AppDomain.CurrentDomain.AssemblyResolve += handler; 
      } 
     } 
    } 
+0

Grazie per questo. Questo è praticamente necessario per la maggior parte dei progetti di nuget. Sperando che lo affrontino presto. – Grapes

+1

Per chi ha difficoltà a fare questo lavoro: Se si ha più di una versione che deve essere rimbalzata, sarà necessario rimuovere la riga AppDomain.CurrentDomain.AssemblyResolve - = handler; Poiché ciò significava che solo la prima versione trovata veniva reindirizzata. – bech

1

Ispirato alla risposta accettata ho pensato che avrei fatto una più generica che tiene conto gli aggiornamenti pure.

Recupera tutti gli assembly, li ordina in ordine decrescente per ottenere la versione più recente in cima, quindi restituisce la versione più recente al momento della risoluzione. Lo chiamo in un costruttore statico me stesso.

public static void RedirectAssembly() 
{ 
    var list = AppDomain.CurrentDomain.GetAssemblies().OrderByDescending(a => a.FullName).Select(a => a.FullName).ToList(); 
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
    { 
     var requestedAssembly = new AssemblyName(args.Name); 
     foreach (string asmName in list) 
     { 
      if (asmName.StartsWith(requestedAssembly.Name + ",")) 
      { 
       return Assembly.Load(asmName); 
      } 
     } 
     return null; 
    }; 
} 
Problemi correlati