答えて

2

今日は直接可能ではありませんが、これを達成する方法について考えています。特定のシナリオを確認するために、https://github.com/Azure/azure-webjobs-sdk-script/issuesの問題を開いてください。ありがとう!

+1

新たな関連問題:https://github.com/Azure/azure-webjobs-sdk-script/issues/1239複数のdll#1239をロードこのため –

8

最新(June'17)のVisual Studio 2017関数ツールを使用していると仮定して、npiaseckiに投稿されたコードスニペットに続いてIssue #992にいくぶん合理的な設定ベースのソリューションを導き出しました。

これはフレームワークによって管理されていても、少なくともコンフィギュレーションドリブンであれば、より多くの変更を分離することができれば理想的です。私はあなたがまた、この設定を書くか、コードを生成する前に、プロジェクト内のナゲットのバージョン(とその依存関係)を調整するいくつかのビルド前のステップやT4のテンプレートを使うこともできると思います。

だから、マイナス面..

...は(これはとにかく頻繁に app.configsで問題となっている)あなたはNuGetパッケージを更新するときBindingRedirects設定を更新することを忘れないように持ってしまいます。 Newtonsoftをリダイレクトする必要がある場合は、設定ドリブンソリューションに関する問題が発生することもあります。

私たちのケースでは、新しいバージョンのAzure Fluent NuGetを使っていましたが、これは特定の機能で並んで使用される通常のARM管理ライブラリのバージョンよりも古いバージョンのMicrosoft.IdentityModel.Clients.ActiveDirectoryに依存していました。

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

おかげCSXのバインディングリダイレクトを提供します。これは、ほとんどのナゲットプロジェクトにはかなり必要です。彼らはすぐにこれに対処するつもりです。 – Grapes

+1

この作業に苦労している人のために:リバウンドが必要なバージョンが2つ以上ある場合は、AppDomain.CurrentDomain.AssemblyResolve - =ハンドラの行を削除する必要があります。 これは、見つかった最初のバージョンのみがリダイレクトされたことを意味しています。 – bech

1

に適していますJoeBrockhausのコードの微調整バージョンです。

すべてのアセンブリをフェッチし、降順に並べ替えて最新のバージョンを取得し、解決の際に最新のバージョンを返します。私は静的なコンストラクタでこれを自分で呼びます。

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