C# 自定义exe引用的dll路径

摘要:
复制<子元素元素描述<使用一个<每个组件;配置>asm.v1“><asm.v1”appliesTo=“v1.0.3705”>assemblyIdentity名称=“mscorcfg”publicKeyToken=“b03f5f7f11d50a3a”文化=“”/>

MSDN原文:https://msdn.microsoft.com/library/twy1dw1e(v=vs.100).aspx

<runtime> 的 <assemblyBinding> 元素
.NET Framework 4             
 
 

包含有关程序集版本重定向和程序集位置的信息。

 
<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>

封装程序集的绑定策略和程序集位置。  为每个程序集使用一个 <dependentAssembly> 标记。 

<probing>

指定加载程序集时公共语言运行时搜索的子目录。

<publisherPolicy>

指定运行时是否采用出版商策略。

<qualifyAssembly>

指定当使用程序集的部分名称时应动态加载的程序集全名。

父元素

 

元素

说明

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中配置

 
  1. <runtime>  
  2.     <gcConcurrent enabled="true" />  
  3.     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
  4.       <publisherPolicy apply="yes" />  
  5.       <probing privatePath="32;64" />  
  6.     </assemblyBinding>  
  7.   </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 来设置

 
  1. if (AppDomain.CurrentDomain.IsDefaultAppDomain())  
  2.  {  
  3.      string appName = AppDomain.CurrentDomain.FriendlyName;  
  4.      var currentAssembly = Assembly.GetExecutingAssembly();  
  5.      AppDomainSetup setup = new AppDomainSetup();  
  6.      setup.ApplicationBase = System.Environment.CurrentDirectory;  
  7.      setup.PrivateBinPath = "Libs";  
  8.      setup.ConfigurationFile = setup.ApplicationBase +  
  9.                          string.Format("\Config\{0}.config", appName);  
  10.      AppDomain newDomain = AppDomain.CreateDomain("NewAppDomain", null, setup);  
  11.      int ret = newDomain.ExecuteAssemblyByName(currentAssembly.FullName, e.Args);  
  12.      AppDomain.Unload(newDomain);  
  13.      Environment.ExitCode = ret;  
  14.      Environment.Exit(0);  
  15.      return;  
  16.  }  
           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失败的时候触发,可以在这个事件里面处理

 
  1. AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;  
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
 
  1. /// <summary>  
  2.         /// 对外解析dll失败时调用  
  3.         /// </summary>  
  4.         /// <param name="sender"></param>  
  5.         /// <param name="args"></param>  
  6.         /// <returns></returns>  
  7.         static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)  
  8.         {  
  9.             string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Libs");  
  10.             path = System.IO.Path.Combine(path, args.Name.Split(',')[0]);  
  11.             path = String.Format(@"{0}.dll", path);  
  12.             return System.Reflection.Assembly.LoadFrom(path);  
  13.         }  
/// <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);
        }

免责声明:文章转载自《C# 自定义exe引用的dll路径》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于querybuilder的可根据现有数据表自动生成Restful API的dotnet中间件Mac下终端工具iTerm2安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle EBS R12 XML数据表格的Excel脚本报表

一.概述 在EBS系统中,报表是一个非常重要的客户化开发内容,也是系统一种比较常见的数据输出形式。报表的做法有很多种,输出格式也有多种,较为常见的就是“数据文件+报表模板”的形式,例如用脚本程序输出XML数据源,RTF模板控制数据格式的方式。也有直接用PLSQL程序输出HTML格式的报表,数据和格式统一在程序中控制。 Excel是一种非常常用的办公软件,操...

maven知识结构笔记

1.什么是maven Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。 maven功能 构建 文档生成...

卸载趋势

开始--运行--输入 regedit----注册表编辑器,导航至以下地址:HKEY_LOCAL_MACHINESOFTWARE(Wow6432Note)TrendMicroPC-cillinNTCorpCurrentVersionMisc. 在右边的窗口里查找并双击Allow Uninstall这个键值,在弹出的窗口里选择十进制数,“数值数据”改为1,...

Springboot结合ESAPI——配置XSS过滤

1、pom添加 <dependency> <groupId>org.owasp.esapi</groupId> <artifactId>esapi</artifactId> <version>2.2.0.0</version> </depend...

Xamarin.Forms学习系列之Syncfusion 制作图形报表

Syncfusion是一家微软生态下的第三方组件/控件供应商,除了用于HTML5和JavaScript的控件外,他们产品还涉及如下领域: WEB ASP.NET MVC ASP.NET WebForms HTML5/JavaScript LightSwitch Silverlight MOBILE iOS Android Windows Phone...

git add --all 为啥不能添加空文件夹,这样设计的初衷是

git add --all 为啥不能添加空文件夹,这样设计的初衷是? 好多项目还得弄个假文件在空文件夹里面占位 这个算设计失误吧,见 https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty_directories.3FCurrently the design of the git inde...