.NET — แก้ Could not load file or assembly โดยไม่ต้องเพิ่ม bindingRedirect ใน Web.config / App.config

Could not load file or assembly ปัญหานี้เกิดจาก มีการใช้ strong-name assembly ชื่อเดียวกันจากหลาย dll และแต่ละ dll ใช้คนละเวอร์ชัน เมื่อโปรแกรมถูกโหลด จะเกิด exception เนื่องจากในโฟลเดอร์ bin ไม่มี dll เวอร์ชั่นที่ต้องการ (อาจมี dll เวอร์ชั่นอื่นที่ใหม่หรือเก่ากว่า)

วิธีแก้ปัญหาคือ ให้เขียน bindingRedirect ไว้ในไฟล์ Web.config / App.config

เช่น ถ้าเจอ

Could not load file or assembly 'Microsoft.Owin, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

ก็ให้เพิ่ม bindingRedirect เพื่อ redirect Microsoft.Owin เวอร์ชั่นที่ต่ำกว่า 3.1.0 ไปใช้ เวอร์ชั่น 3.1.0.0 แทน (โปรเจคต้องติดตั้ง Microsoft.Owin เวอร์ชั่น 3.1.0.0)

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

ในกรณีที่ไม่ต้องการเขียน bindingRedirect ในไฟล์คอนฟิก ให้ใช้วิธี อิมพลีเมนต์ AssemblyResolve

โดยเขียน handler ให้ event AppDomain.CurrentDomain.AssemblyResolve ใน entry point ของโปรแกรม เช่น ในไฟล์ Global.asax.cs ของ ASP.NET หรือในฟังก์ชั่น Main ของ Console App

protected void Application_Start() {
...
AppDomain.CurrentDomain.AssemblyResolve += HandleAssemblyResolve;
}
private Assembly HandleAssemblyResolve(object sender, ResolveEventArgs args) {
  var firstOrDefault = args.Name.Split(',').FirstOrDefault();
return Assembly.Load(firstOrDefault);
}
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.