MSDN原文:https://msdn.microsoft.com/library/twy1dw1e(v=vs.100).aspx
<runtime> 的 <assemblyBinding> 元素
包含有關程序集版本重定向和程序集位置的信息。
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705"> </assemblyBinding>
以下幾節描述了屬性、子元素和父元素。
特性
| 特性 |
說明 |
|---|---|
| xmlns |
必選特性。 指定程序集綁定所需的 XML 命名空間。 使用字符串“urn:schemas-microsoft-com:asm.v1”作為值。 |
| appliesTo |
指定 .NET Framework 程序集重定向所應用的運行時版本。 此可選特性使用 .NET Framework 版本號指示其適用的版本。 如果沒有指定 appliesTo 特性,<assemblyBinding> 元素將適用於 .NET Framework 的所有版本。 appliesTo 特性是在 .NET Framework 1.1 版中引入的;.NET Framework 1.0 版將忽略該特性。 這意味着,即使指定了 appliesTo 特性,在使用 .NET Framework 1.0 版時所有的 <assemblyBinding> 元素也都適用。 |
子元素
| 元素 |
說明 |
|---|---|
| 封裝程序集的綁定策略和程序集位置。 為每個程序集使用一個 <dependentAssembly> 標記。 |
|
| 指定加載程序集時公共語言運行時搜索的子目錄。 |
|
| 指定運行時是否采用出版商策略。 |
|
| 指定當使用程序集的部分名稱時應動態加載的程序集全名。 |
父元素
| 元素 |
說明 |
|---|---|
| configuration |
每個配置文件中的根元素,常用語言 runtime 和 .NET Framework 應用程序會使用這些文件。 |
| runtime |
包含程序集綁定和垃圾回收的相關信息。 |
下面的示例顯示如何將一個程序集版本重定向到另一個版本並提供基本代碼。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
<codeBase version="2.0.0.0"
href="http://www.litwareinc.com/myAssembly.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
下面的示例顯示如何使用 appliesTo 特性重定向 .NET Framework 程序集綁定。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705">
<dependentAssembly>
<assemblyIdentity name="mscorcfg" publicKeyToken="b03f5f7f11d50a3a" culture=""/>
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime
exe文件和dll文件分開在不同目錄,這時候可以有3種方法
1.在app.config中配置
- <runtime>
- <gcConcurrent enabled="true" />
- <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
- <publisherPolicy apply="yes" />
- <probing privatePath="32;64" />
- </assemblyBinding>
- </runtime>
<runtime>
<gcConcurrent enabled="true" />
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<publisherPolicy apply="yes" />
<probing privatePath="32;64" />
</assemblyBinding>
</runtime>
2. AppDomain.CurrentDomain.AppendPrivatePath來設置
3.new AppDomainSetup().PrivateBinPath 來設置
- if (AppDomain.CurrentDomain.IsDefaultAppDomain())
- {
- string appName = AppDomain.CurrentDomain.FriendlyName;
- var currentAssembly = Assembly.GetExecutingAssembly();
- AppDomainSetup setup = new AppDomainSetup();
- setup.ApplicationBase = System.Environment.CurrentDirectory;
- setup.PrivateBinPath = "Libs";
- setup.ConfigurationFile = setup.ApplicationBase +
- string.Format("\\Config\\{0}.config", appName);
- AppDomain newDomain = AppDomain.CreateDomain("NewAppDomain", null, setup);
- int ret = newDomain.ExecuteAssemblyByName(currentAssembly.FullName, e.Args);
- AppDomain.Unload(newDomain);
- Environment.ExitCode = ret;
- Environment.Exit(0);
- return;
- }
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
string appName = AppDomain.CurrentDomain.FriendlyName;
var currentAssembly = Assembly.GetExecutingAssembly();
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = System.Environment.CurrentDirectory;
setup.PrivateBinPath = "Libs";
setup.ConfigurationFile = setup.ApplicationBase +
string.Format("\\Config\\{0}.config", appName);
AppDomain newDomain = AppDomain.CreateDomain("NewAppDomain", null, setup);
int ret = newDomain.ExecuteAssemblyByName(currentAssembly.FullName, e.Args);
AppDomain.Unload(newDomain);
Environment.ExitCode = ret;
Environment.Exit(0);
return;
}
可有時候又不想把他放在config文件上,只想用代碼來實現,第二中方法發現已經過期,第三種方法MSDN語焉不詳的,網上也沒有什么資料,目前就用第四種方法
4.AppDomain有個AssemblyResolve事件,加載dll失敗的時候觸發,可以在這個事件里面處理
- AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
- /// <summary>
- /// 對外解析dll失敗時調用
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
- {
- string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Libs\");
- path = System.IO.Path.Combine(path, args.Name.Split(',')[0]);
- path = String.Format(@"{0}.dll", path);
- return System.Reflection.Assembly.LoadFrom(path);
- }
/// <summary>
/// 對外解析dll失敗時調用
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
/// <returns></returns>
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Libs\");
path = System.IO.Path.Combine(path, args.Name.Split(',')[0]);
path = String.Format(@"{0}.dll", path);
return System.Reflection.Assembly.LoadFrom(path);
}
