2011-11-29 8 views
3

웹 응용 프로그램 내에서 동일한 어셈블리 바이트를 두 번로드하면 어떻게되는지 궁금합니다.Assembly.Load (byte [])는 어떻게 작동합니까?

이 코드

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll"); 

var loadedAssem = Assembly.Load(assem); 

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin; 

이 코드를 실행하고 첫 번째 요청에 나는 그것이 램에 어셈블리 (또는 HTTP 런타임 응용 프로그램 도메인을?)을로드 할 가정이 예를 들어

후 나는의 인스턴스를 만들 수 있습니다 거기에 뭐든간에.

이 코드를 다시 실행하면 두 번째 요청에서 첫 번째 요청에서 어셈블리가 어떻게 될까요?

램에 여전히 존재합니까? 그렇다면 두 어셈블리 간의 차이점은 무엇입니까? 또는 이전에 선언 된 클래스를 덮어 씁니까?

필자는 PHP에서 "require_once"가 아닌 PHP를 사용합니다.

답변

7

두 개의 고유 한 복사본을로드합니다. 각 어셈블리는 응용 프로그램에서 사용할 수 있습니다. 각 어셈블리의 유형은 고유 한 유형이며 서로 상호 작동하지 않습니다. 예를 들어 Copy1에서 위젯을 가져 와서 Copy2에서 위젯을 가져 오는 메소드로 전달하려고하면 런타임 오류가 발생합니다. 그들은 이러한 방식으로로드 된 이후에이 어셈블리를 언로드 할 수 없습니다 인스턴스에 관한


(즉, 기본 응용 프로그램 도메인에.) : 당신이 Assembly.CreateInstance을 (사용하는 경우

  • 에 그림과 같이 post)를 호출하면 호출에 사용한 Assembly 인스턴스에서이 인스턴스가 만들어집니다.
  • 문자열을 사용하는 Activator.CreateInstance를 사용하는 경우 어셈블리 이름을 지정해야합니다. 이 경우로드 된 어셈블리는 모두 동일한 이름을 갖기 때문에 기본적으로 어셈블리 일치 규칙을 사용하므로 처음에로드 한 어셈블리와 우선 일치한다고 생각합니다. AppDomain.AssemblyResolve 이벤트를 연결하여 자신의 우선 순위를 부여하고 가장 최근에로드 한 어셈블리를 사용할 수 있습니다.
+0

같은 어셈블리의 복사본 두 개를로드하고 위젯과 같은 클래스의 인스턴스를 만들면 서로 다르다는 것을 알았을 때 어떤 어셈블리가 클래스를 인스턴스화할까요? –

+0

당신이 "CreateInstance"를 호출했을 때 ... –

+0

그래 ... 나 정말 그걸 물어 보았 니? 늦었 어. 나는 자야 해. 좋아, 그래서 만약 내가이 2 사본을로드하고 난 그들 중 하나를 사용해야하고 다른 언로드 내가 그들을 별도의 appdomain에로드하고 해당 도메인을 언로 드해야할까요? –

관련 문제