2009-12-08 5 views
5

Microsoft.Build.BuildEngine과 관련된 문제가 발생하여 내 .exe.config 파일을 수정하여 다음을 추가해야합니다.어셈블리 바인딩을 프로그래밍 방식으로 수정

<?xml version ="1.0"?> 
<configuration> 
     <runtime> 
      <assemblyBinding xmlns="urnchemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
       <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
       <assemblyIdentity name="Microsoft.Build.Engine" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
       <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

내 문제는 내가 코드에 의해 그것을 해결하기 위해이 파일을 수정할 수 없습니다, 나는 그, 오른쪽 가능해야하는데 생각입니까?

하지만 어떻게하면 위의 변경 사항이 설정 파일에서 만들어진 것처럼 실행되도록 응용 프로그램을 수정할 수 있습니까?

+0

감사합니다 David ... 올바른 형식의 XML을 수정하려고했는지 알려주세요 – sebagomez

+0

코드 블록을 포맷하려면 앞에 빈 줄이 있어야하고 각 행의 시작 부분에 최소한 4 칸 있어야합니다. 암호. –

답변

10

나는 비슷한 문제로 어려움을 겪고있었습니다. 핵심은 AppDomain.AssemblyResolve 이벤트를 사용하는 것입니다. 이것은 완전히 버전 번호를 무시하고 "FooLibrary"라는 이름의 라이브러리 참조를 위해 이미로드 라이브러리를 대체

public void LoadStuff(string assemblyFile) 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += 
      new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
     var assembly = Assembly.LoadFrom(assemblyFile); 

     // Now load a bunch of types from the assembly... 
    } 

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var name = new AssemblyName(args.Name); 
     if (name.Name == "FooLibrary") 
     { 
      return typeof(FooClass).Assembly; 
     } 
     return null; 
    } 

: 여기처럼 내 코드가 어떻게 표시되는지를 보여줍니다. 좀 더 제한적으로 사용하려면 AssemblyName 클래스의 다른 속성을 사용할 수 있습니다. FooClass은 FooLibrary 어셈블리의 모든 클래스가 될 수 있습니다.

+0

이것은 TFS 빌드에서 실행되는 MSTest와 완벽하게 작동하며 구성 파일을 선택하지 않습니다. –

+0

디버거에서이 이벤트가 리소스 어셈블리에만 적용되는 몇 가지 문제가있었습니다. 제작 과정에서 매력과 같습니다. 감사! –

2

부팅하는 중 하나의 방법은 별도의 appdomain에서 원래 앱을 시작하는 부트 스트랩 앱을 만드는 것입니다. 새 도메인을 설정하면 프로그래밍 방식으로 구성 파일을 빌드 할 수 있습니다.

+0

설정 파일을 쓰면 무엇을 의미합니까? 프로그래밍 방식으로 수정하고 싶지는 않지만 내 설정이 이미 수정 된 것처럼 내 앱을 실행하고 싶습니다. – sebagomez

+2

수정 - 빌드. 구성 파일의 내용은 AppDomain.CreateDomain 메서드에 전달할 수있는 매개 변수 중 하나입니다 (AppDomainSetup 인스턴스 내부). 이렇게하면 즉시 빌드 할 수 있습니다. – mfeingold

관련 문제