2011-02-17 4 views
3

다음 작업을 수행하려고합니다. 앱 A는 '마더 앱'입니다. 그것은 열려 있습니다. App B는 App.D에서 지정된 인터페이스에서 파생 된 일부 클래스를 작성하는 .DLL입니다.AppDomain에서 .DLL을 언로드 할 때 도움이 필요합니다. - 여전히 ShadowCopy로도 작동하지 않습니다.

그런 다음 App A에서 App B의 클래스를 "가져 와서"메소드를 실행합니다. 동적으로 App B (코드 변경 및 재 컴파일)를 변경하고 App A에서 새 코드를 사용할 수 있기를 원합니다.

새로운 .DLL을 App A 디렉토리에 복사하는 Post-compile 명령이 App B에 있습니다. . App A는 새 AppDomain을 만들고 ShadowCopying을 사용합니다. 이 충분할 것이라고 생각했지만 & 응용 프로그램 B 새 .DLL 복사 할 때 해당 파일을 사용하고 덮어 쓸 수 없습니다 말한다.

애플리케이션 A (코드 TESTSERVER) :

namespace TestServer 
{ 
    public interface IRunnable 
    { 
     void Run();   
    } 

    class Program 
    {   
     static void Main(string[] args) 
     { 
      AppDomainSetup setup = new AppDomainSetup(); 
      setup.ApplicationName = "DemoApp"; 
      setup.ApplicationBase = Environment.CurrentDirectory; 
      setup.ShadowCopyDirectories = Environment.CurrentDirectory; 
      setup.ShadowCopyFiles = "true"; 
      int _domain = 1; 

      while (true) 
      { 
       string typeName = Console.ReadLine(); 

      AppDomain appDomain = AppDomain.CreateDomain("DemoDomain" + _domain, null, setup); 

      IRunnable runner = appDomain.CreateInstanceFromAndUnwrap("TestClient.dll", typeName) as IRunnable; 

      runner.Run(); 

      AppDomain.Unload(appDomain); 
      _domain++; 
      } 
     } 
    } 
} 

애플리케이션 B (코드 TestClient을)

namespace TestClient 
{  
    public class TestRunner : TestServer.IRunnable 
    { 
     public void Run() 
     { 
      Console.WriteLine("RUNNING"); 
     } 
    } 

    public class Bob : TestServer.IRunnable 
    { 
     public void Run() 
     { 
      Console.WriteLine("BOB"); 
     } 
    } 
} 
여기

제가 현재로서는있는 코드

다른 앱 도메인의 항목을 사용하는 경우 해당 앱 도메인이 .DLL 또는 somethi를 자동으로로드 할 수 있음을 읽었습니다. 그 선을 따라. 이 경우 인터페이스를 사용하면 기본 AppDomain이 .DLL을로드하여 잠금으로 설정되어 있습니다.

어떻게이 문제를 해결할 수 있습니까?/더 나은 설정이 있습니까 ??

참고 : 코드를 업데이트 했는데도 여전히 동일한 결과가 나타납니다.

+0

유용한 정보 : http://social.msdn.microsoft.ok/ko/ko/clr/thread/4d4dedc3-dc1c-411e-9c4c-29208942e834 –

+0

그래, 해킹하고 그냥이 문제를 해결하기로 결정했습니다. 이 솔루션은 우아하고 가깝지만 작동합니다. 기본적으로 새 이름을 입력 할 때마다 dll을 다른 이름으로 복사하고로드 한 다음 사용합니다. 결국, 나는 그것들을 시도하고 삭제한다 (그들이 갇혀 있지 않다면). 더 나은 프로그래머가 될 때까지 내 문제를 해결하십시오. – philmo

답변

3

어셈블리 및 형식을 가져올 때 코드가 여전히 AppDomain이라는 마더에서 실행됩니다. 모든 코드는 생성 된 도메인에서 실행되어야합니다. 내 웹 사이트에 그런 일을 설정하는 하나의 방법 보여준 : 내가 아니에요에 확실히 100 % A simple way to start your code in a different AppDomain

을하지만 당신이

업데이트

를 수행해야합니다 확실히 한 단계입니다

거기에 제시된 솔루션 측면에서, 주자에 대한 인스턴스 생성은 DomainLifetimeHook 상속자에서 발생합니다. 표시된 인프라는 Start 및 Stop 메서드가 AppDomainExpander 클래스에서 만든 AppDomain에서 실행되도록합니다. Expander는 새 도메인을 만드는 클래스이므로 도메인 설정은 도메인의 Create 메서드로 이동해야합니다.

+0

링크를 확인한 후 다시 확인해 드리겠습니다. 건배 – philmo

+0

A가 실행 중일 때 A가 새 코드를 실행하도록하는 동안 내 주된 관심사는 일부 코드를 작성할 수 있다는 것입니다. 이 방법으로 효과가 있습니까? 그렇지 않다면 나는 이것을 올바른 방법으로 시도하고 있습니까, 아니면 다른 것을 고려해야합니까? – philmo

+0

나는 본다. 나는 그것을 시도 할 것이다. 도움말 flq 주셔서 감사합니다! – philmo

0

주요 문제는 당신이 할 곳 :

Type type = assm.GetType("TestClient." + typeName); 

이 응용 프로그램 A의 주요 응용 프로그램 도메인에서 발생되고, 결과가 그 주요 응용 프로그램 도메인 잠금 앱 B의 조립

FLQ 년대에 링크 된 .dll 그의 블로그 게시물에 대한 답변이 도움이 될 것입니다.

+0

코드를 업데이트했지만 성공하지 못했습니다. 어떤 아이디어? 나는 주 AppDomain에서 무엇이라도 부를 것이라고 생각하지 않지만 분명히 오인 될 수 있습니다. – philmo

0

ObjectHandle의 랩을 해제하자마자 형식을 기본 appdomain에로드해야합니다. 제대로 작동하려면 랩핑되지 않은 ObjectHandle에서 작동해야합니다.

+0

아니요. Unwrap()은 다른 AppDomain의 개체에 대한 프록시를 반환하므로 기본 AppDomain에로드 할 형식을 정의하는 어셈블리가 필요하지 않습니다. – Iridium