C# 사용자 정의exe 참조의 dll 경로

8382 단어

MSDN 텍스트:https://msdn.microsoft.com/library/twy1dw1e(v=vs.100).aspx

<runtime>의 <assemblybinding> 요소


.NET Framework 4             
 
기타 버전
        
  • .NET Framework (current version)        
  • .NET Framework 3.5        
  • .NET Framework 3.0        
  • .NET Framework 2.0        

  •         
     
     
    프로그램 집합 버전 리셋과 프로그램 집합 위치에 대한 정보를 포함합니다.
     
    복제하다
    <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 기능이 지정되지 않으면 요소가 적용됩니다.NET Framework의 모든 버전입니다.appliesTo의 특성은.NET Framework 버전 1.1에 도입된;.NET Framework 버전 1.0에서는 이 특성을 무시합니다.이것은 appliesTo 특성을 지정하더라도 사용하고 있음을 의미한다.NET Framework 1.0 릴리즈에서는 모든 요소가 적용됩니다. 

    하위 요소


     
    원소.
    설명

    봉인된 프로그램 집합의 귀속 정책과 프로그램 집합 위치입니다.프로그램 집합마다 표시를 사용합니다. 

    프로그램 집합을 불러올 때 공용어가 실행될 때 검색할 하위 디렉터리를 지정합니다.

    실행할 때 출판사 정책을 사용할지 여부를 지정합니다.

    프로그램 집합의 일부 이름을 사용할 때 동적으로 불러올 프로그램 집합의 전체 이름을 지정합니다.

    부모 요소


     
    원소.
    설명
    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. 앱에서.config에서 구성
     
     
      
  •       

  •       
  •         

  •         
  •       

  •   
      
    <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에 Assembly Resolve 이벤트가 있습니다. dll을 불러오는 데 실패할 때 터치하면 이 이벤트에서 처리할 수 있습니다.
     
     
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;  
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

     
    ///   
  • ///대외 해석 dll 실패 시 호출
  •         /// 
      
  •         ///   

  •         ///   
  •         ///   

  •         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);
            }

    좋은 웹페이지 즐겨찾기