在開發上有時我們會需要將組件版本導向,可能是因為不同專案用到不同版本的相依組件,或是基於某些原因要將某個組件用特定版本替換。這時我們可以透過 Assembly Binding Redirect 來做到這件事。

Assembly Binding Redirect 可在電腦或是應用程式層級進行組件的導向,這邊以應用程式層級的導向做個簡單的介紹。

首先,Config 檔內必須在 configuration untime 節點下加入 assemblyBinding 節點,其 xmlns 屬性需指定字串 “urn:schemas-microsoft-com:asm.v1”。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	...
	<runtime>
		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">...</assemblyBinding>
	</runtime>
	...
</configuration>

若要限定特定 .NET Framework 版本的組件才做導向,可加上 appliesTo 屬性,並指定 .NET Framework 的版本。像是要指定只對 .NET 3.5 的組件導向的話可下面這樣編寫:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	...
	<runtime>
		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v3.5">...</assemblyBinding>
	</runtime>
	...
</configuration>

接著在 assemblyBinding 下我們需加上 assemblyIdentity 節點,用以指定所要導向的組件。像是要導向 Json.NET 組件的話就會像下面這樣:

<?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" />
				...
			</dependentAssembly>
		</assemblyBinding>
	</runtime>
	...
</configuration>

最後在 assemblyBinding 下再加上 bindingRedirect 節點,用以指定要從哪個版本導向哪個版本就可以了。

<?xml version="1.0" encoding="UTF-8"?>
<runtime>
	<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
		<dependentAssembly>
			<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral" />
			<!--<bindingRedirect oldVersion="5.0.7.0" newVersion="6.0.0.0" />-->
			<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
		</dependentAssembly>
	</assemblyBinding>
</runtime>