اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
زمانیکه پروژهی شما وابستگیهای متعددی داشته باشد، احتمال برخوردن به یک چنین خطایی بسیار محتمل است:
کتابخانهی Newtonsoft.Json جزو پروژههایی است که مدام به روز رسانی و نگهداری میشود. در این بین ممکن است وابستگی A از نگارش 4.5 آن استفاده کند و وابستگی B بر اساس نگارش 4.7 آن کامپایل شده باشد و وابستگی جدیدی از نگارش 6 آن استفاده کند. در یک چنین حالتی زمانیکه پروژهی شما آخرین نگارش JSON.NET را به همراه داشته باشد، وابستگیهای A و B پیام یافت نشدن نگارشهای خاص کتابخانهی Newtonsoft.Json را صادر خواهند کرد و در این حالت، برنامه در همان ابتدای کار کرش میکند. برای رفع این مشکل میتوان به دات نت گفت که تمام درخواستهای مرتبط با JSON.NET را به اسمبلی خاصی هدایت و پردازش کن. به این قابلیت assembly redirects گفته میشود و به نحو ذیل در فایلهای کانفیگ برنامه (app.config یا web.config) قابل تعریف است:
به این ترتیب تمام اسمبلیهایی که بر اساس نگارش قدیمی JSON.NET کامپایل شدهاند، باور خواهند کرد که نگارش 6 آن، همان نگارشی است که باید با آن کار کنند.
به روز رسانی قسمت assembly redirects توسط NuGet
البته اگر بستهی جدیدی را توسط نیوگت نصب کنیم، این assembly redirects به صورت خودکار توسط آن اضافه خواهند شد اما ... گاهی ممکن است موارد قدیمی را به روز نکند یا موردی فراموش شوند یا حتی اگر اطلاعاتی را پیشتر از وب یافتهاید، دارای خطای تایپی باشند. برای یک چنین مواردی اگر با خطای Could not load file or assembly ابتدای بحث مواجه شدید، مراحل ذیل را طی کنید تا بتوانید قسمت assembly redirects را بازسازی کنید:
الف) به فایل config برنامه مراجعه کرده و کلا قسمت assemblyBinding آنرا حذف کنید.
ب) سپس دستور ذیل را در کنسول پاورشل نیوگت اجرا کنید:
این دستور به تمام پروژههای موجود در solution جاری مراجعه کرده و قسمت assemblyBinding آنها را بر اساس آخرین اطلاعات پروژهها و وابستگیهای آنها به روز میکند.
Could not load file or assembly Newtonsoft.Json or one of its dependencies. The system cannot find the file specified.
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- ... --> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
به روز رسانی قسمت assembly redirects توسط NuGet
البته اگر بستهی جدیدی را توسط نیوگت نصب کنیم، این assembly redirects به صورت خودکار توسط آن اضافه خواهند شد اما ... گاهی ممکن است موارد قدیمی را به روز نکند یا موردی فراموش شوند یا حتی اگر اطلاعاتی را پیشتر از وب یافتهاید، دارای خطای تایپی باشند. برای یک چنین مواردی اگر با خطای Could not load file or assembly ابتدای بحث مواجه شدید، مراحل ذیل را طی کنید تا بتوانید قسمت assembly redirects را بازسازی کنید:
الف) به فایل config برنامه مراجعه کرده و کلا قسمت assemblyBinding آنرا حذف کنید.
ب) سپس دستور ذیل را در کنسول پاورشل نیوگت اجرا کنید:
PM> Get-Project -All | Add-BindingRedirect