2012-04-19 4 views
0

모두 나는 이미 다음과 같은 시나리오 작업이 있습니다동적/실행시 로딩 여기서 C과 기준 B

  • 조립 A.exe : 윈폼 응용 프로그램을 호출합니다.
  • 어셈블리 B.dll : 클래스 라이브러리는 A으로 하드 참조됩니다.
  • 어셈블리 C.dll : 런타임에 컴파일되고 B (클래스는 B 클래스에서 상속됩니다) 참조.

A.exe는, 실행시 C.dll 일부 코드를 컴파일 어셈블리를로드하고 난 DLL로 디스크에 C를 컴파일 할 경우,이 같은 폴더에 B.dll 집어 ((B.BaseClass) C.DerivedClass).BaseMethod();

를 호출합니다. 그러나 디스크에 C.dll을 쓰고 싶지 않습니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

답변

1

나는 (예 : Program.cs 또는 App.xaml.cs를 같이 어딘가에 일찍 응용 프로그램에서 AssemblyResolve 등록)는 일반적으로 같은 것을 할 :

//Since we'll be dynamically loading assemblies at runtime, we need to add an appropriate resolution path 
    //Otherwise weird things like failing to instantiate TypeConverters will happen 
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    var domain = (AppDomain)sender; 

    foreach (var assembly in domain.GetAssemblies()) 
    { 
     if (assembly.FullName == args.Name) 
      return assembly; 
    } 

    return null; 
} 
+0

감사합니다. 나는 당신이 말하는 것을 얻지 만, 나는 그 방법이 무엇을하는지 확신하지 못한다. 이 이벤트가 발생하면 내 코드가 런타임에 현재 appdomain에 이미로드 된 어셈블리에 액세스하는 방법을 알려주지 않아야합니까? 나는 반성에 처음이므로 당신의 솔루션을 더 잘 이해하려고 노력하고 있습니다. –

+0

그건 그렇고, 나는 언제나'C'가 호출되기 전에로드 된 것을 확인하기 위해 어셈블리'B'에서 객체를 인스턴스화합니다. 관련성이 있는지 확실하지 않습니다. –

+0

이것은 이미로드 된 경우 B를 제공하는 좋은 방법입니다. 그렇지 않다면, 당신은 Assembly.LoadFile (string Path)'핸들러에서 할 수 있습니다. 그것은 그것의 목적입니다. – Seb