۱۳۹۰/۰۱/۱۰

به روز رساني ارجاعات يك اسمبلي داراي امضاي ديجيتال بدون كامپايل مجدد


سؤال: امروز NHibernate به روز شده اما Fluent NHibernate خير! چكار بايد كرد؟!

Fluent NHibernate كتابخانه‌اي است جهت رهايي برنامه نويس‌ها از نوشتن فايل‌هاي XML نگاشت كلاس‌ها به جداول به همراه قابليت‌هاي ديگري مانند نگاشت خودكار و غيره. بنابراين اين كتابخانه بدون NHibernate اصلي بدون كاربرد است. تيم توسعه آن هم با تيم اصلي NHibernate يكي نيست. عموما NHibernate به روز مي‌شود اما Fluent NHibernate ممكن است تا دو ماه بعد از آن هم به روز نشود. در اين مواقع چه بايد كرد؟

دو كار را مي‌توان انجام داد:

الف) سورس Fluent NHibernate را دريافت كنيم و سپس ارجاعات قبلي به NHibernate قديمي را حذف و ارجاعاتي را به اسمبلي‌هاي جديد آن اضافه و پروژه را كامپايل كنيم.
Fluent NHibernate در طي اين مدت به اندازه كافي رشد كرده و به قولي پخته است. كاري را هم كه ادعا مي‌كند به خوبي انجام مي‌دهد. اما چون اسمبلي‌هاي اصلي NHibernate و همچنين Fluent NHibernate داراي امضاي ديجيتال هستند، نمي‌توان از اسمبلي‌هاي جديد NHibernate به همراه Fluent NHibernate قديمي‌ استفاده كرد. خطاي حاصل شبيه به عبارات ذيل خواهد بود:

System.IO.FileLoadException: Could not load file or assembly ‘nameOfAssembly’,
Version=specificVersion, Culture=neutral, PublicKeyToken=publicKey’ or one of it's dependencies.
The located assembly’s manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)

حذف ارجاعات به NHibernate قديمي و افزودن مجدد ارجاعات به فايل‌هاي جديد و كامپايل نهايي پروژه يك راه حل است.

ب) راه حل ديگر استفاده از ويژگي bindingRedirect است بدون دريافت سورس، حذف و افزودن ارجاعات و كامپايل مجدد:
  <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NHibernate"
publicKeyToken="aa95f207798dfdb4"
culture="neutral" />
<bindingRedirect oldVersion="3.0.0.4000"
newVersion="3.1.0.4000"/>
</dependentAssembly>
</assemblyBinding>
</runtime>


در اين مثال، پس از افزودن تعاريف فوق به فايل config برنامه، به سادگي مي‌توان از اسمبلي اصلي NHibernate داراي نگارش 3.1.0.4000 به جاي اسمبلي قديمي‌تر 3.0.0.4000 آن استفاده كرد (همان نگارشي كه Fluent NHibernate ما بر اساس آن كامپايل شده) و ديگر نيازي هم به كامپايل مجدد پروژه‌اي كه از يك اسمبلي قديمي Fluent NHibernate استفاده مي‌كند، نخواهد بود.