📖

ど素人が C# で作られたサイトの dll を更新作業をした時のお話

2016/11/02に公開

状況

サイト内でとあるベンダのサービスを利用していたが、サービスの仕様変更に伴って連携するためのモジュールを変更する必要があった。
その更新モジュールのうち1つが、サイトの基盤部分でも使用している dll ファイルだった。
該当の dll を新しくするとサイト自体が死に、dll を前のままでやるとサービス連携部分が死ぬという状態。

正攻法と思われるもの

dll を新しくした上で、サイト自体をリビルドする。

それを行えなかった理由

ビルド前のソースコードがなかった。
ビルドが行われたのが3年近く前で、担当が何人も入れ替わっていた上に全員退職済みだった。
(ソースは会社の財産だってことをもっと認識してほしい)

解決方法

Web.config に設定を追加し、古いバージョンが要求された場合は別のディレクトリに配置した dll を参照するようにした。

記述

<runtime>
	<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
		<dependentAssembly>
			<assemblyIdentity name="[dllの名前]" publicKeyToken="dllの署名" culture="neutral" />
			<codeBase version="[古いdllのバージョン]" href="[参照させたいdllの場所]" />
			<publisherPolicy apply="no" />
		</dependentAssembly>
	</assemblyBinding>
</runtime>

どういうこと?

アセンブリバージョンのリダイレクトとかいう機能らしい。
厳密名を使わない場合は強制的に別バージョンの dll を参照させることができるらしいけど、今回は厳密名を利用していたため、別のディレクトリに配置した dll を利用するような設定を行った。
詳しくは MSDN 参照で。

注意

古い .NetFramework では動かないらしい。

Discussion