2016-10-24 5 views
0

C#에서 GetEntryAssembly의 기본 구현은 무엇입니까? 그리고 DLL이 관리되지 않는 응용 프로그램에서로드되었을 때 null을 반환하는 이유는 무엇입니까?왜 GetEntryAssembly가 null을 반환합니까?

MSDN 설명서는 말한다 : 관리되는 어셈블리 관리되지 않는 응용 프로그램에서로드 된 경우

GetEntryAssembly 방법은 null을 반환 할 수 있습니다. 예를 들어 관리되지 않는 응용 프로그램이 C#으로 작성된 COM 구성 요소의 인스턴스를 만드는 경우 프로세스의 진입 점이 관리되는 어셈블리가 아닌 관리되지 않는 코드이므로 C# 구성 요소의 GetEntryAssembly 메서드를 호출하면 null이 반환됩니다. > 혼합 모드 어셈블리 (C++/CLI) - -> 관리 조립 (C#을)

관리되는 어셈블리입니다

기본 실행 파일 (C++) :

나는 다음과 같은 설정을 가지고 선택적, 혼합 모드 어셈블리에서 GetEntryAssembly를 호출하고 null을 얻을 수 있습니다.

우리는 C#을 source code이 전화를 추적 한 디버깅하는 동안

:

[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode), SuppressUnmanagedCodeSecurity] 
private static extern void GetEntryAssembly(ObjectHandleOnStack retAssembly); 

우리는 항목의 어셈블리가 네이티브 실행해야 볼 수 있습니다. 그러나 그것은 검색되지 않습니다. 나는 이것에 대한 이유가 무엇인지 궁금하다. 관리되는 전환에 기본이되어서는 안됩니까?

GetEntryAssembly

편집 .NET 내부적으로 사용됩니다. null을 반환하면 부작용이 발생합니다.

System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForDomain(); 

이것은 다음과 같은 예외가 발생합니다 : 관리되는 어셈블리에서 한 줄을 재현 는 System.IO.IsolatedStorage.IsolatedStorageException: Unable to determine the identity of domain.이 예외의 근본 원인은 항목 어셈블리가 null 인 것 같다.

+1

CLR에서 구현됩니다. 물론 같은 경우에는 Assembly 객체 참조를 반환 할 수 없으며 네이티브 C++ 실행 파일은 어셈블리가 아닙니다. Process.GetCurrentProcess()를 대신 사용해보십시오. –

+0

내 코드에서 GetEntryAssembly를 직접 사용하지 않습니다. 이것은 C#에서 내부적으로 사용됩니다. 그리고 그것은 null을 반환하기 때문에, 다른 코드는 오동작을 일으킨다. 예 : 'System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForDomain'을 호출하면'System.IO.IsolatedStorage.IsolatedStorageException : 도메인의 신원을 확인할 수 없습니다. ' – Robertas

+0

"다른 코드를 수정해야합니다. 라인 ", 그것은 고립 된 스토리지 작동에 의존 수 없습니다.귀하의 질문 btw 에서이 정보를 숨길 때 아무 소용이, 그것은 우리가 당신을 도울하지 않습니다. –

답변

0

어셈블리는 .NET 전용 클래스입니다. 언급 한대로 관리되지 않는 코드에서 관리되는 메서드를 호출하면 GetEntryAssembly는 아무 것도 반환 할 이유가 없기 때문에 null을 반환합니다.

어셈블리의 모든 메서드는 .NET 아키텍처에 바인딩되므로 C++, Java 또는 기타 외부 컴파일 된 소스를 구현할 수 없습니다.

여전히 이해가되지 않는다면, 이런 종류의 어셈블리와 함께 리플렉션을 사용하여 상상해보십시오 : 하드 코어에 최적화 된 C++ 이름의 메소드 가져 오기 또는 변수 유형 가져 오기 ... C + +, 다른 언어는 말할 것도 없습니다.

+0

'GetEntryAssembly'는 .NET 구현 내에서 호출됩니다. 'GetEntryAssembly'가 이전에 null을 반환했기 때문에 어떤 줄이 예외로 인해 실패 했습니까? .NET에서 'Native -> Mixed mode -> Managed'워크 플로가 모두 지원되는 것은 아닙니다. – Robertas

관련 문제