문제

나는 MSDN 문서를보고 있었고 여전히 사용의 차이점이 무엇인지에 대해 약간 혼란스러워합니다. LoadFile 그리고 LoadFrom 어셈블리를로드 할 때. 누군가가 그것을 더 잘 설명하기 위해 모범이나 비유를 제공 할 수 있습니까? MSDN 문서는 나를 더 혼란스럽게했다. 도 ReflectionOnlyLoadFrom 동일합니다 LoadFrom 조립품을 반사 모드로만로드한다는 점을 제외하고.

.NET 경험이 가장 크지 않기 때문에로드 파일을 사용한 MSDN 문서에 관한 몇 가지 질문이 있습니다.

1) 무엇을 의미 하는가 LoadFile 동일한 정체성을 가지고 있지만 다른 경로에있는 어셈블리를 검사합니까? 정체성 (예) 란 무엇입니까?

2) 그것은 말한다 LoadFile 파일을 '컨텍스트에서로드'에로드하지 않으며로드 경로를 사용하여 종속성을 해결하지 않습니다. 이것이 무엇을 의미합니까, 누군가가 모범을 제공 할 수 있습니까?

3) 마지막으로, 그것은 그것을 나타냅니다 LoadFile LoadFrom은 동일한 정체성을 가지고 있지만 다른 경로를 가지고있는 어셈블리를로드 할 수 없기 때문에이 제한된 시나리오에서 유용합니다. 그것은 첫 번째 어셈블리 만로드 할 것입니다. 다시 한 번 같은 질문, 어셈블리의 정체성은 무엇입니까?

도움이 되었습니까?

해결책

이것이 명확 해지나요?

// path1 and path2 point to different copies of the same assembly on disk:

Assembly assembly1 = Assembly.LoadFrom(path1);
Assembly assembly2 = Assembly.LoadFrom(path2);

// These both point to the assembly from path1, so this is true
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

assembly1 = Assembly.LoadFile(path1);
assembly2 = Assembly.LoadFile(path2);

// These point to different assemblies now, so this is false
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

편집하다: 수정 된 질문에서 제기 한 질문에 답하기 위해 확실히 읽고 싶습니다. Suzanne Cook은 조립 정체성에 대해 요리합니다.

어셈블리가로드되는 방식을 관리하는 많은 규칙이 있으며, 일부 규칙은 종속성을 해결하는 방법과 관련이 있습니다. 어셈블리가 어셈블리에 의존하는 경우 .NET은 어디서 어셈블리를 찾아야합니까? 글로벌 어셈블리 캐시에서, 동일한 디렉토리가 Assemblya 또는 다른 곳에서 발견 되었습니까? 또한 해당 어셈블리의 여러 사본을 찾으면 어떻게 사용할 것인지 어떻게 선택해야합니까?

LoadFrom 하나의 규칙 세트가 있습니다 LoadFile 다른 규칙 세트가 있습니다. 사용해야 할 많은 이유를 상상하기는 어렵습니다 LoadFile, 그러나 동일한 어셈블리의 다른 사본에 반사를 사용해야한다면, 그것은 당신을 위해 있습니다.

다른 팁

에서 수잔 쿡의 블로그:

로드 파일 대 하중

조심하십시오 - 이것들은 같은 것이 아닙니다.

loadfrom ()은 융합을 거치고 다른 경로에서 다른 어셈블리로 리디렉션 될 수 있지만 컨텍스트에서 하중에 이미로드 된 경우 동일한 정체성을 사용합니다.

LoadFile ()은 Fusion을 통해 전혀 바인딩하지 않습니다. 로더는 발신자가 요청한 내용을 정확하게로드합니다. 부하 또는로드 컨텍스트에서로드를 사용하지 않습니다.

따라서 LoadFrom ()은 일반적으로 요청한 것을 제공하지만 반드시 그런 것은 아닙니다. Loadfile ()은 실제로 요청한 것을 정확하게 원하는 사람들을위한 것입니다. (*그러나 v2에서 시작하여 정책은 loadfrom () 및 loadfile () 모두에 적용되므로 LoadFile ()는 반드시 요청 된 내용 일 필요는 없습니다. 또한 ID가있는 어셈블리가있는 경우 V2에서 시작합니다. GAC, GAC 사본은 대신 사용됩니다. RECINGENLYLOADFF ()를 사용하여 원하는 것을 정확히로드하십시오. 그러나 그러한 방식으로로드 된 어셈블리는 실행할 수 없습니다.)

loadfile ()에는 캐치가 있습니다. 바인딩 컨텍스트를 사용하지 않기 때문에 해당 디렉토리에서 종속성을 자동으로 찾을 수 없습니다. 로드 컨텍스트에서 사용할 수없는 경우, 결합하려면 AssemblyResolve 이벤트를 구독해야합니다.

보다 여기.

또한 참조하십시오 바인딩 컨텍스트 선택 같은 블로그의 기사.

많은 머리를 긁는 후 나는 오늘 오후에 차이를 발견했습니다.

런타임에 DLL을로드하고 싶었고 DLL은 다른 디렉토리에 살았습니다. 그 DLL에는 동일한 디렉토리에도 살았던 자체 의존성 (DLL)이있었습니다.

loadFile () : 특정 DLL을로드했지만 종속성은 아닙니다. 따라서 첫 번째 호출이 DLL 내에서 다른 DLL 중 하나로 이루어 졌을 때 FilenotFoundException을 던졌습니다.

loadfrom () : 내가 지정한 DLL과 해당 디렉토리에 살았던 모든 종속성을로드했습니다.

참고 : 8.3 경로를 사용하여 하나의 어셈블리가로드 된 다음 8.3 이외의 경로에서로드되면 동일한 물리적 DLL이더라도 다른 어셈블리로 간주됩니다.

내가 알아 차린 한 가지 차이점은 다음과 같습니다.

Assembly.loadfile - 제한된 사용자 권한 (Diffrence Principel)으로 다른 앱 도메인에 어셈블리를로드합니다. 직렬화/탈선과 같은 작업을 수행 할 수 없습니다.

Assembly.loadfrom- 동일한 사용자 권한 (동일한 원칙)으로 동일한 appdomain에 어셈블리를로드합니다.

.NET마다로드 컨텍스트가 다릅니다. Suzanne Cook은 여기에 다음과 같이 썼습니다. http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

이것은 참고 문헌이 혼합되지 않은 .NET 검역소입니다.

제 경우에는 @에 위치한 ASP 응용 프로그램 캐시를 간단히 삭제해야했습니다. C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files. 사이트가 처음 실행되면 재건됩니다. 먼저 IIS를 중지하십시오.

이것이 나에게 한 사람이 나를 위해 한 사람을 도울 수 있기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top