2017-10-08 11 views
1

내 목표는 해당 어셈블리의 여러 버전에 대해 특정 어셈블리를 사용하는 코드 "조각" "을 실행하는 것입니다. 필자가 수행하는 방법은 각 어셈블리 버전마다 하나씩, 별도의 AppDomains에서 "코드 조각"을 실행하는 것입니다. 은 "코드의 조각"반영을 통해 어셈블리를 사용하지만, 제가하고 싶은 것은 "코드조각은"강력한 형식의 방법으로 기입 해 있다는 것입니다 때 여러 AppDomain에 여러 어셈블리 버전로드

나는이 만 할 수 있었다. 즉

,이 전하여 다음 있다고 가정 해 봅시다 : 또한

namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     internal const string Version = "1.0.0.0"; 
     public string Method1() { return Version; } 
    } 
} 

그것을 가지고있는 AssemblyInfo.cs에 다음과 같은 정의 :

[assembly: AssemblyVersion(ClassLibrary1.Class1.Version)] 
이제

의 난은 "버전"이 있다고 가정하자 예를 들어, 여러 버전의 해당 어셈블리가있는 폴더 :

/Versions/ 
├─ /1000/ 
│ └─ ClassLibrary1.dll 
├─ /1001/ 
│ └─ ClassLibrary1.dll 
└─ /1002/ 
    └─ ClassLibrary1.dll 

은 "코드의 조각을"실행 나는 다음과 같은 콘솔 응용 프로그램을 사용하고 있습니다 :

class Program 
{ 
    static void PieceOfCode(Assembly assembly) 
    { 
     Type class1Type = assembly.GetType("ClassLibrary1.Class1"); 
     dynamic class1 = Activator.CreateInstance(class1Type); 
     string vesion = class1.Method1(); 

     Console.WriteLine(vesion); 
    } 

    public sealed class SeparateDomainExecutor : MarshalByRefObject 
    { 
     public void Execute(Action<Assembly> action, string assemblyPath) 
     { 
      action(Assembly.LoadFrom(assemblyPath)); 
     } 
    } 

    static void Main(string[] args) 
    { 
     foreach (string file in Directory.EnumerateFiles(@"C:\Versions", "*.dll", SearchOption.AllDirectories)) 
     { 
      AppDomain domain = AppDomain.CreateDomain("ClassLibrary1 Domain"); 

      var type = typeof(SeparateDomainExecutor); 
      var runner = (SeparateDomainExecutor)domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName); 
      runner.Execute(PieceOfCode, file); 

      AppDomain.Unload(domain); 
     } 

     Console.Read(); 
    } 
} 

콘솔 응용 프로그램이 잘 작동하지만 내가 다음과 같은 뭔가 "PieceOfCode"에서 그 반사 사용을 대체 할 싶습니다

static void PieceOfCode() 
{ 
    ClassLibrary1.Class1 class1 = new ClassLibrary1.Class1(); 
    Console.WriteLine(class1.Method1()); 
} 

이것이 가능합니까?

내가 가진 문제는 PieceOfCode가 특정 버전의 ClassLibrary1 (아마도 최신 버전)을 사용하여 작성되었으며 별도의 AppDomain에서 해당 버전을 "재정의"할 수 없다는 것입니다. 나는 몇 가지 시도를했지만 항상 FileLoadException으로 끝납니다.

+0

강력한 명명 된 어셈블리이고 응용 프로그램을 잘로드하기 전에 버전을 알고 있다면 app/web .config 파일에서 바인딩 리디렉션 및 변경 버전을 사용할 수 있습니다. –

+0

"강력하게 형식화 된"은 "여러 버전" . .NET은 형식 ID에 어셈블리의 버전 번호를 포함하여 강력한 형식 검사를 구현합니다. 강력한 DLL 지옥 카운터 - 측정,하지만 분명히 디자인으로 지옥을 만들고 싶어. 그래서 당신은 이것을 전혀하고 싶지 않습니다. –

+0

예, 정확하게. 기본적으로 나는 강력한 이름 인 dll-hell 보호 기능을 무시하기를 원했습니다. – bellpatricia

답변