2010-03-12 6 views
1

나는 dll (abc.dll, .net 3.5에서도)을 참조하는 vb.net 3.5 응용 프로그램을 가지고있다. 이 dll은 때때로 응용 프로그램에 의해 액세스된다. 실행 중에 언제든지 dll을 삭제하면 다음에 DLL에서 클래스를 사용하려고 할 때 응용 프로그램에서 오류가 발생합니다. 그러나 이것은 내가 보는 행동이 아닙니다. 시작하기 전에 dll을 삭제하면 시작시 응용 프로그램에서 오류가 발생합니다. 하지만 dll이 시작된 후에 삭제되지는 않습니다.참조가 삭제 될 때 어떻게해야합니까?

이것이 표준 동작입니까, 아니면 잘못 되었습니까? 클래스를 사용할 때 DLL을 찾을 수 없으면 응용 프로그램에 오류가 발생할 수 있습니까?

미리 감사드립니다.

+0

이것은 데스크톱 응용 프로그램입니다 – Apeksha

+0

시작 오류를 제거하고 사용하고 있다면 오류가 있습니까, 아니면 어셈블리가 삭제되면 오류가 있습니까? –

답변

3

짧은 대답 no. DLL이로드되면 해당 DLL을 사용하는 응용 프로그램 AppDomain 인스턴스가 프로세스에서 언로드 될 때까지로드됩니다. 그런 다음에 만 원래 DLL을 삭제할 수 있습니다.

긴 대답 :

는 DLL이 프로세스에로드되는 방식에 의존하기 때문에 이것은 복잡한 문제이다. 이것이 발생할 수있는 몇 가지 다른 방법이 있습니다.

  • 디스크의 직접로드 해제. 이것은 내가 가장 잘 알고 있지만이 경우 CLR은 어셈블리에서 파일 잠금을 취할 수 있으므로 모두 삭제할 수 있어야합니다.
  • 섀도 디렉터리에서로드 중입니다. 이 경우 DLL은 원래 DLL을 삭제하는 등의 작업을 수행 할 수 있도록 디스크의 다른 디렉토리에서 실제로로드됩니다. 이것은 웹 응용 프로그램 시나리오에서 널리 사용됩니다. 이 경우 원본 DLL을 삭제하면 중요 DLL이 sort.s의 임시 디렉터리에서로드되므로 의미가 없습니다.
+0

감사합니다 JaredPar. 내 옵션이 다음과 같습니다 : 1) 내 프로젝트에서 참조하는 대신 dll을 직접 디스크에서로드하십시오. 2) dll에서 클래스를 사용하기 전에 파일 존재 여부를 확인하십시오. 어느 쪽이 더 좋을지 잘 모르겠습니다. – Apeksha

+0

@Apeksha, 삭제되는 DLL이 일반적인 시나리오 인 경우 가장 좋은 방법은 DLL이없는 경우 발생하는 예외를 catch하는 메서드에서 해당 클래스의 로딩을 간단하게 래핑하는 것입니다. 그것은 상황을 처리하는 가장 신뢰할 수있는 방법입니다. – JaredPar

0

.NET Framework가 참조하는 어셈블리를로드하려고 할 때 항상 오류가 발생합니다. 그래서 CLR이 응용 프로그램 시작시 어셈블리를로드하기로 결정한 것처럼 보입니다.

관련 문제