2009-11-19 2 views
4

.NET에서 네임 스페이스의 DLL을 찾는 방법은 무엇입니까? using? 예, 우리는/referene : c : \ program files **에 경로를 언급하고 있지만 배포 후 &을 배포하고 소프트웨어가 일부 사용자의 컴퓨터에 설치되었을 때 언급합니다. 그것은 (개발자) 내가 언급 한 것과 동일한 경로에 있지 않을 수도 있습니다. 나는 그것이 다른 곳에서있을 수 있다는 것을 의미합니까?.NET은 내가 '사용하고있는'네임 스페이스의 dll을 어떻게 찾을 수 있습니까?

  1. 그럼 .NET은 어떻게 찾습니까?
  2. .NET은 런타임시 dll에 모든 네임 스페이스가 있음을 어떻게 알 수 있습니까?
  3. 사용자가 동일한 dll을 가지고 있지만 이름을 변경하면 어떻게됩니까? .net 그것을로드 할 실패합니까? 관련이없는 개념은

답변

6

.NET SDK에서 fuslogvw.exe를 실행하고 디스크에 대한 모든 바인딩 로깅을 활성화하면 다양한 프로빙 단계를 볼 수 있습니다. .NET CLR이 어셈블리 참조를 해석하는 데 사용하는 다양한 경로를 볼 수 있습니다. 엄지 손가락의 규칙은 먼저 전역 어셈블리 캐시를 시도한 다음 다른 대체 경로와 함께 로컬 디렉토리를 확인하는 것입니다.

+0

재미 있겠지만 "Windows SDK 도구> 퓨전 로그 뷰어"를 시작했을 때 모든 버튼이 해당 창에서 비활성화되었습니다. 설정 대화 상자에서도 모든 기능이 비활성화됩니다. – claws

+0

UAC가 활성화 된 상태에서 Vista 또는 Windows 7을 사용하는 경우 퓨전 로깅 설정을 변경하려면 관리자 권한이 필요하므로 승격 된 명령 프롬프트에서 실행해야합니다. – Josh

+0

"엄지 손가락의 규칙은 먼저 전역 어셈블리 캐시를 시도한 다음 다른 대체 경로와 함께 로컬 디렉토리를 확인하는 것입니다." ".NET MYSQL CONNECTOR"(MySql.Data 사용)를 설치 한 경우 컴파일 타임에 참조를 사용하여 dll을 탐지하지만 경로는 c : \ programfiles \ mysql \ .net \ mysql.dll과 같을 것입니다. 그러나 응용 프로그램이 빌드 된 후 다른 일부가이를 사용하고 있습니다. 내 모든 응용 프로그램은 mysql.dll이 아니라 usermachine에 있습니다.net 커넥터는 d : \ apps \ somecrap \ mysql.dll에 설치 될 수 있습니다. 그러면 어떻게 발견 할 수 있겠습니까? – claws

3

이름에 설명되어 있습니다.

컴파일 된 어셈블리는 name을 포함하여 다른 어셈블리를 참조합니다.

어셈블리가로드되면 here과 같은 이름을 검색하여 해당 참조를로드합니다. 어셈블리의 가장 일반적인 위치는 시스템의 Global Assembly Cache과 응용 프로그램의 기본 디렉토리입니다.

어셈블리 및 모든 참조 (및 참조의 참조 등)를로드 한 후 런타임은 어셈블리에서 필요한 형식을로드합니다. 예를 들어

, 당신은

using System; 

... 
String x = "Hello World"; 

에서와 유형 String를 사용하는 경우 C# 컴파일러는 String가 외모와 mscorlib 어셈블리의 System.String 유형으로 해결하고이 비슷한에 코드를 변환 :

[mscorlib]System.String x = "Hello World"; 

그래서 문이 실행될 때 런타임 유형 System.String의 전체 이름과 유형을 포함하는 어셈블리의 이름을 모두 알고있다.

+0

컴파일 된 어셈블리는 약한 이름으로 다른 어셈블리를 참조 할 수도 있습니다. –

5

기술적으로 DLL에는 네임 스페이스가 없습니다.

CLR 수준에서는 이름 공간이 전혀없고 전체 클래스 이름 만 있습니다. CLR 클래스 이름은 임의로 긴 유니 코드 문자 시퀀스로 구성 될 수 있습니다. @#$%은 CLR과 관련하여 완벽하게 훌륭한 클래스 이름입니다.

이제, 컨벤션 (CLS, 구체적으로하는)에 의해 는, 클래스 이름이 특정 유니 코드 문자로 제한됩니다 (영숫자 및 _, 그리고 다른 이국적인 유니 코드 범주의 무리 - 추가 정보를 원하시면 사양 참조) 점, 점은 네임 스페이스를 나타내는 데 사용됩니다. 이것은 컴파일러 (및 기타 도구) 사이의 관례입니다.

따라서 어셈블리가 어떤 이유로 든 일부 형식을 참조 할 때마다 System.String과 같은 전체 CLR 이름을 사용하기 만합니다. 그러나 실제로는 어셈블리가 포함 된 완전한 이름을 사용합니다.ildasm 출력을 보면 그 값을 볼 수 있습니다. [mscorlib]System.String과 비슷하게 보이므로 런타임에서 어디를 볼 수 있는지 알 수 있습니다.

다른 말로하면 CLR은 System.String 클래스의 어셈블리 mscorlib.dll과이 클래스를 참조하는 어셈블리 B.exe가 [mscorlib]System.String 인 것을 확인합니다. using 문은 출력 DLL/EXE에 코드를 생성하지 않습니다. 그게 바로 당신이 항상 System.String을 쓸 필요가 없기 때문입니다.

[mscorlib]System.String에, mscorlib.dll를 참조하는 프로젝트에서는, using System; 문의 범위에 String 말하는 코드를 변환하는 컴파일러의 일이다. 그것은 모두 컴파일시에 완료됩니다. 런타임에 CLR이 수행하는 유일한 작업은 mscorlib을 확인하여 실제 mscorlib.dll을 디스크에 저장하는 것입니다 (다른 대답은 어떻게 발생하는지 정확하게 설명합니다).

+0

어떻게 System.String에서 [mscorlib] System.String으로 변환합니까? mscorlib 어셈블리에서 어떻게 알 수 있습니까? System.String은 매우 일반적인 유형입니다. 맞춤형 타사 유형은 어떤가요? 컴파일러는 클래스가 위치한 어셈블리를 어떻게 알 수 있습니까? – claws

+1

컴파일하는 프로젝트가 참조하는 (또는 명령 줄에서'/ r :'을 사용하여 지정하는) 모든 어셈블리 내부를 볼 것입니다. 두 어셈블리를 참조하는 두 어셈블리가'System.String'이라는 클래스를 정의하면 컴파일러 오류가 발생합니다 (C#에서는 'extern alias'를 사용하여 어셈블리를 모호하게 할 수 있습니다). –

+0

"CLR이 런타임에 수행하는 유일한 작업은 mscorlib을 확인하여 디스크의 실제 mscorlib.dll을 찾는 것입니다." --- ".NET MYSQL CONNECTOR"(MySql.Data 사용)가 설치되어 있다고 말하십시오. 컴파일 타임에 참조를 사용하여 dll을 탐지하지만 경로는 c : \ programfiles \ mysql \ .net \ mysql.dll과 같을 것입니다. 그러나 응용 프로그램이 빌드 된 후 다른 일부가이를 사용하고 있습니다. 내 모든 응용 프로그램은이 mysql.dll을 알고 있지만 usermachine에서이 .net 커넥터는 d : \ apps \ somecrap \ mysql.dll에 설치 될 수 있습니다. 그러면 어떻게 감지 할 수 있습니까? 내 원래의 질문은 내가 분명하지 않은 경우입니다. – claws

관련 문제