ответ

2

Сегодня это невозможно, но мы думаем о путях достижения этого. Не могли бы вы открыть вопрос по адресу https://github.com/Azure/azure-webjobs-sdk-script/issues, чтобы убедиться, что ваш конкретный сценарий рассмотрен? Благодаря!

+1

новый связанный с этим вопрос: Предоставление Binding переадресовывает для CSX загрузки нескольких DLL # 1239 https://github.com/Azure/azure-webjobs-sdk-script/issues/1239 –

8

Предполагая, что вы используете новейший (June'17) Visual Studio 2017 Function Tooling, я получил несколько разумное решение на основе конфигурации для этого, следуя фрагменту кода, отправленному npiasecki по адресу Issue #992.

Было бы идеально, если бы это было реализовано через фреймворк, но, по крайней мере, с помощью конфигурации, у вас есть немного более изоляция изменений. Я полагаю, вы могли бы также использовать некоторые шаги предварительной сборки или шаблоны T4, которые сверяли версии nugets в проекте (и их зависимости), прежде чем записывать эту конфигурацию или генерировать код.

Так оборотная ..

.. становится, чтобы помнить, чтобы обновить BindingRedirects конфигурации при обновлении пакета NuGet (это часто проблема в app.configs все равно). У вас также может быть проблема с конфигурационным решением, если вам нужно перенаправить Newtonsoft.

В нашем случае мы использовали новый Azure Fluent NuGet, который имел зависимость от более старой версии Microsoft.IdentityModel.Clients.ActiveDirectory, чем версия обычных библиотек управления ARM, которые используются бок о бок в конкретной функции.

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

Спасибо за это. Это в значительной степени необходимо для большинства проектов nuget. Надеясь, что они обратятся к этому в ближайшее время. – Grapes

+1

Для тех, кто борется за выполнение этой работы: если у вас есть более одной версии, которую нужно отскочить, вам придется удалить строку AppDomain.CurrentDomain.AssemblyResolve - = обработчик; Поскольку это означало, что только первая найденная версия была перенаправлена. – bech

1

Вдохновленных принятого ответом я решил сделать более общие один, который принимает в модернизацию счета, а также.

Он извлекает все сборки, заказывает их по убыванию, чтобы получить самую новую версию сверху, а затем возвращает самую новую версию при разрешении. Я называю это в статическом конструкторе.

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; 
    }; 
} 
Смежные вопросы