۱۳۹۰/۰۵/۲۱

به روز رساني اسمبلي‌هاي داراي امضاي ديجيتال در VS.NET

زمانيكه در VS.NET يك اسمبلي داراي امضاي ديجيتال را اضافه مي‌كنيم، در فايل پروژه برنامه مدخلي شبيه به عبارت زير اضافه مي‌شود:

<Reference Include="NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">

همانطور كه ملاحظه مي‌كنيد، شماره نگارش فايل، PublicKeyToken و غيره دقيقا ذكر مي‌شوند. حال اگر همين پروژه را بخواهيد به نگارش 3.2 ارتقاء دهيد، احتمالا به روش متداول كپي اسمبلي جديد در پوشه bin برنامه اكتفاء خواهيد كرد. برنامه هم پس از يك Rebuild، به خوبي كامپايل مي‌شود و مشكلي ندارد. اما به محض اجرا و ديباگ در VS.NET، با خطاي زير مواجه خواهيد شد:

Could not load file or assembly 'NHibernate, Version=2.0.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' 
or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. 
(Exception from HRESULT: 0x80131040)

بله! هنوز به دنبال نگارش 2 مي‌گردد و به نظر، نگارش 3.2 جديد را نديد گرفته است. مشكل هم به همان مدخل دقيق موجود در فايل پروژه برنامه، مرتبط است. اين مدخل صرفا با copy/paste فايل‌هاي جديد در پوشه bin برنامه يا rebuild پروژه، «به روز نمي‌شود» !
يا بايد دستي اين فايل csproj يا vbproj را ويرايش كنيد، يا يكبار بايد از داخل VS.NET اين ارجاعات را حذف كرده و مجددا بر اساس فايل‌هاي جديد ايجاد كنيد تا فايل پروژه برنامه بر اين اساس به روز شود.

اين مشكلي هست كه حداقل با تمام مثال‌هاي NHibernate دريافتي از اين سايت خواهيد داشت.


روش ديگر حل اين مشكل، مراجعه به خواص اسمبلي اضافه شده در ليست ارجاعات پروژه در VS.NET و خاموش كردن گزينه‌ي "Specific Version" آن است.


به صورت خلاصه حين به روز رساني اسمبلي‌هاي داراي امضاي ديجيتال:
  • يا بايد ارجاعات داراي امضاي ديجيتال را حذف و بار ديگر اضافه كنيد.
  • يا بايد فايل پروژه برنامه را با يك ويرايشگر متني ساده باز كرده و شماره نگارش‌ها را اصلاح كنيد. (ساده‌ترين روش ممكن)
  • يا خاموش كردن بررسي Specific Version را هم آزمايش كنيد.