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

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);
        }
时间: 2024-12-21 12:41:46

C# 自定义exe引用的dll路径的相关文章

设置程序PrivatePath,配置引用程序集的路径(分离exe和dll)

原文:设置程序PrivatePath,配置引用程序集的路径(分离exe和dll) 有时候我们想让程序的exe文件和dll文件分开在不同目录,这时候可以有3种方法 1.在app.config中配置 [html]?view plain?copy <runtime>?? ????<gcConcurrent?enabled="true"?/>?? ????<assemblyBinding?xmlns="urn:schemas-microsoft-com:

.NET Winform 将引用的dll文件集成到exe中(转)

Winform程序经常需要引用一些第三方dll文件,这些dll在发布后与exe文件保存在同一目录下,虽然将dll文件集成到exe中会增大文件尺寸,但程序目录会相对整洁. 下面介绍一种比较简单的集成方法和注意事项. 第一步,将需要引用的dll文件复制到项目中 您可以:1.复制到项目根目录:2.复制到某个文件夹中. 此处以将dll复制到"lib"文件夹为例. 将要引用的dll文件复制到"lib"文件夹中 第二步,引用复制到项目中的dll文件 右键点击"引用&q

Visual Studio 10.0设置引用HalconDotNet.dll

开始做Halcon的上位机,选用Visual Studio 10.0平台. 具体设置以C#,VB为例子,如下: C# 第一步: 01.新建项目 02.选择Visual C# 03.修改文件名 04.确认 第二步: 01.选择"解决方案资源管理器" 02.选择"引用",右键 03.选择"添加引用" 第三步: 01.在添加引用选项卡选择浏览 02.选择路径:X:\Program Files\MVTec\HALCON-10.0\bin\dotnet20

转载:C# 将引用的DLL文件放到指定的目录下

当软件引用的DLL比较多的时候,全部的DLL都放在exe同目录下,显得比较乱,如果能把dll放到响应的文件夹下面,就方便很多 下面是解决该问题的一种方法: 右键点击项目:属性->设置,项目会生成一个app.config文件,在<configuration>节点后面添加下面的节点,重新生成一下即可,指定的目录即为生成exe所在路径的次级dll文件目录 <?xml version="1.0" encoding="utf-8" ?> <

sharepoint 2013基于AD的Form表单登录(四)——开发自定义登录过程需要引用文件路径。

1.Microsoft.IdentityModel.dll 位置 %ProgramFiles%\ReferenceAssemblies\Windows Identity Foundation\v3.5 2.Microsoft.SharePoint.IdentityModel.dll位置 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SharePoint.IdentityModel\v4.0_15.0.0.0__71e9bce111e94

以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用

原文:以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 ; Script generated by the Inno Setup 脚本向导. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! ; 为1的时候表示定义成试用版本 #define VERSION_TYPE ReadIni('Setup.ini', 'SetupType', 'type', '0') #if VER

C#中用ILMerge将所有引用的DLL打成一个DLL文件

C#中用ILMerge将所有引用的DLL打成一个DLL文件 有些文件是必须一起使用的,如果能把多个DLL打包成一个DLL文件,那么引用文件的时候就不需要一个个地去引用,而且每次移动文件的时候也不至于少了哪个必须的DLL文件. 多个DLL文件打包成一个DLL文件的方法如下:1.先到下面的网址下载ILMerge安装 http://www.microsoft.com/en-us/download/details.aspx?id=17630 2.安装完之后,执行cmd命令,进入ILMerge目录, 把t

Mint Linux自定义快捷键不支持中文路径的问题的解决

/*********************************************************************  * Author  : Samson  * Date    : 04/28/2014  * Test platform:  *              3.11.0-12-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

Asp.Net数据控件引用AspNetPager.dll分页

今天与大家分享一下"Asp.Net数据控件引用AspNetPager.dll分页"首先声明以下几点: 1.也许讲解有点初级,希望高手不要"喷"我,因为我知道并不是每一个人都是高手,我也怕高手们说我装13,小生不才: 2.如有什么不对的地方,还希望大家指出,一定虚心学习: 3.本文属于作者原创,尊重他人劳动成果,转载请注明作者,谢谢. 下面开讲: 第一步:首先是下载一个AspNetPager.dll 下载地址 http://files.cnblogs.com/tand