네임 스페이스 또는 어셈블리?


84

네임 스페이스와 어셈블리간에 매우 혼란스러워지고 있습니다. 인가 System.DataSystem.Web네임 스페이스 또는 어셈블리?

나는 이것들이 네임 스페이스라고 불리는 동시에 GAC_32폴더에 존재한다는 것을 알아 차 렸습니다 . 그래서 정확히 무엇입니까?


1
약간 도움이 될 수있는 stackoverflow.com/questions/668161/… 을 참조하십시오 .
pswg

답변:


102

System.DataA는 네임 스페이스 , System.Data.DLL(파일)이 있습니다 조립 .

네임 스페이스는 유형의 논리적 그룹입니다 (대부분 이름 충돌을 방지하기 위해). 어셈블리는 여러 네임 스페이스의 유형을 포함 할 수 있으며 ( System.DLL몇 개 포함), 단일 네임 스페이스는 어셈블리에 분산 될 수 있습니다 (예 :) System.Threading.


2
어떤 어셈블리에 어떤 네임 스페이스가 포함 될지 어떻게 지정합니까?
Ehsan Sajjad

@EhsanSajjad 둘 사이에 직접적인 관계 가 없습니다 . 어셈블리는 일반적으로 프로젝트를 통해 코드 파일에서 빌드되며 각 파일에는 네임 스페이스에있는 클래스가 포함됩니다. 따라서 프로젝트에있는 파일을 선택하여 간접적으로 결정합니다. 그래도 도움이되지 않으면 새로운 질문을 자유롭게하십시오.
D Stanley

말이 되는군요. 감사!!
Ehsan Sajjad

@EhsanSajjad, namespace어셈블리를 만들기 위해 컴파일 된 소스 코드에서 C # 문 (또는 다른 .NET 언어의 동등한 문)을 사용합니다. 두 번째 어셈블리가 네임 스페이스를 다시 열고 클래스를 더 추가 할 수 있습니다.
Concrete Gannet 2011

60

네임 스페이스 는 동일한 기능에 속하는 클래스의 논리적 그룹입니다. 그래서System.WebSystem.Data네임 스페이스는

MSDN은 다음과 같이 설명합니다.

네임 스페이스는 C # 프로그래밍에서 두 가지 방식으로 많이 사용됩니다. 첫째, .NET Framework는 네임 스페이스를 사용하여 많은 클래스를 구성합니다. 둘째, 자체 네임 스페이스를 선언하면 대규모 프로그래밍 프로젝트에서 클래스 및 메서드 이름의 범위를 제어하는 ​​데 도움이 될 수 있습니다.

네임 스페이스

어셈블리 는 .NET 런타임 환경에서 실행할 수있는 (미리 컴파일 된) 코드 덩어리입니다. 하나 이상의 네임 스페이스를 포함합니다. .NET 프로그램은 하나 이상의 어셈블리로 구성됩니다.

System.Web.dll그리고 System.Data.dll어셈블리입니다.

MSDN은 다음과 같이 설명합니다.

어셈블리는 .NET Framework 응용 프로그램의 구성 요소입니다. 배포, 버전 제어, 재사용, 활성화 범위 지정 및 보안 권한의 기본 단위를 형성합니다. 어셈블리는 함께 작동하고 기능의 논리적 단위를 형성하도록 빌드 된 유형 및 리소스의 모음입니다. 어셈블리는 형식 구현을 인식하는 데 필요한 정보를 공용 언어 런타임에 제공합니다. 런타임에는 어셈블리 컨텍스트 외부에 형식이 존재하지 않습니다.

어셈블리


두 가지 방법? 두 번째는 어디 있습니까? :)
Jugal Thakkar


약간 다르게 말하면 네임 스페이스에는 두 가지 목적이 있습니다. 하나는 유형에 대한 계층 적 "목차"를 제공하여보다 쉽게 ​​찾을 수 있도록하는 것입니다. 네임 스페이스의 이름을 기억할 수있는 경우 IntelliSense는 해당 유형의 짧은 목록을 제공합니다. 두 번째 목적은 이름 충돌을 관리하고 방지하는 것입니다. 당신이 네임 스페이스 "시스템"을 피할 수있는 경우, "마이크로 소프트"와 "윈도우", 당신은 알고 당신의 유형의 누구도 마이크로 소프트와 충돌하지 않습니다.
Concrete Gannet

17

요컨대 :

어셈블리:

어셈블리는 물리적 코드 그룹화의 기본 단위를 제공하며 출력 단위입니다. 배포 단위 및 버전 관리 단위입니다. 어셈블리에는 MSIL 코드가 포함되어 있습니다.

네임 스페이스 :

네임 스페이스는 논리적 코드 그룹화의 기본 단위를 제공합니다. 네임 스페이스는 각 이름에서 고유 한 이름의 컬렉션입니다. 클래스 그룹에 대한 논리적 경계를 형성합니다 .Namespace는 Project-Properties에서 지정해야합니다 .Namespace must be specified in Project-Properties.


15

요컨대 :

  • 어셈블리는 .EXE 또는 .DLL 파일로 저장됩니다.
  • 네임 스페이스는 유형 이름을 그룹화하고 이름 충돌 가능성을 줄이는 방법입니다.

팁.

어셈블리에는 형식 컬렉션이 포함됩니다 (예 : l' assembly System에는 System, System.IO, ecc를 포함한 많은 네임 스페이스가 포함됨). 일반적으로 어셈블리의 이름은 포함 된 네임 스페이스와 동일하지만 항상 그런 것은 아닙니다.

어셈블리 및 네임 스페이스의 다른 예.

어셈블리 1 ( CoreAssembly.DLL )

네임 스페이스 Namespace1.subnamespace1을 포함합니다.

어셈블리 2 ( ExtensionCoreAssembly.DLL )

네임 스페이스 Namespace1.subnamespace1을 포함합니다.

다른 네임 스페이스를 포함하는 어셈블리의 이름을 사용하고이 기술을 사용하여 기존 어셈블리를 다른 어셈블리로 확장 할 수 있습니다.

정의.

어셈블리

어셈블리는 기능의 논리적 단위를 형성하는 유형 및 리소스의 모음입니다. .NET Framework의 모든 형식은 어셈블리에 있어야합니다. 공용 언어 런타임은 어셈블리 외부의 형식을 지원하지 않습니다. Visual Basic .NET을 사용하여 Microsoft Windows® 응용 프로그램, Windows 서비스, 클래스 라이브러리 또는 기타 응용 프로그램을 만들 때마다 단일 어셈블리를 빌드하게됩니다. 각 어셈블리는 .exe 또는 .dll 파일로 저장됩니다. 참고 여러 파일에 걸쳐있는 어셈블리를 만드는 것이 기술적으로 가능하지만 대부분의 상황에서이 기술을 사용하지는 않습니다.

네임 스페이스

Visual Basic .NET 코드를 구성하는 또 다른 방법은 네임 스페이스를 사용하는 것입니다. 네임 스페이스는 어셈블리를 대체하는 것이 아니라 어셈블리를 보완하는 두 번째 구성 방법입니다. 네임 스페이스는 유형 이름을 그룹화하고 이름 충돌 가능성을 줄이는 방법입니다. 네임 스페이스는 다른 네임 스페이스와 유형을 모두 포함 할 수 있습니다. 유형의 전체 이름에는 해당 유형을 포함하는 네임 스페이스 조합이 포함됩니다.

링크 : http://msdn.microsoft.com/en-us/library/ms973231.aspx


14

이들은 네임 스페이스입니다. 어셈블리에는 둘 이상의 네임 스페이스가 포함됩니다. 예 : System.dll다음 네임 스페이스 (및 그 이상)를 포함합니다 .For example : contains these namespaces (and more) :

여기에 이미지 설명 입력

또한 하나의 네임 스페이스에는 중첩 된 네임 스페이스가 포함될 수 있습니다. 또한 코드를 구성하기위한 논리적 이름 일뿐입니다. DLL파일은 네임 스페이스가 포함 된 어셈블리입니다.

GAC이다 전역 어셈블리 캐시 . MSDN 에 따르면 :

전역 어셈블리 캐시는 컴퓨터의 여러 응용 프로그램에서 공유하도록 특별히 지정된 어셈블리를 저장합니다.

그래서 일반적으로에 저장된 어셈블리를 사용 GAC하기 때문에 당신은 당신이에 저장된 project.The 어셈블리에서 참조되는 프로젝트 디렉토리에있는 모든 어셈블리 파일을 복사 할 필요가 없습니다 GAC있는 강력한 이름의 당신은에 대한 참조를 추가 할 때 assemblies.Normally 파일 Strong-Named의 복사본 이 아닌 프로젝트의 어셈블리가 폴더에 .dll생성됩니다. bin\Debug어셈블리 (예 : 클래스 라이브러리 프로젝트)를 Strong-Named로 만들 수 있습니다. 참조 : 방법 : Strong으로 어셈블리에 서명 이름


그렇다면 누가 또는 무엇이 하나 이상의 어셈블리를 결정합니까? 여러 네임 스페이스가있는 프로젝트를 만듭니다. 생성되는 어셈블리 수와 어떤 어셈블리 아래에 어떤 네임 스페이스가 들어가는지를 결정하는 것은 무엇입니까?
eaglei22

11

다른 사람들은이 질문에 대해 매우 훌륭하고 상세한 답변을 제공했습니다. 그러나 확실하지 않은 경우 MSDN을 살펴볼 수 있음을 지적하고 싶습니다. MSDN 라이브러리는 주어진 유형이있는 네임 스페이스어셈블리 를 매우 명확하고 간단하게 설명 합니다. (in System.Data.dll)모호함이 없도록 파일 이름도 표시됩니다 .

여기에 이미지 설명 입력


9

GAC에서 볼 수있는 파일 System.Data.dll은 어셈블리이며 System.Data. Visual Studio에서 참조 속성을 보면 다음이 표시됩니다.

여기에 이미지 설명 입력

나중에 참조를 마우스 오른쪽 버튼으로 클릭하고 개체 브라우저에서보기를 선택하면 해당 특정 어셈블리에 네임 스페이스가 표시됩니다.

여기에 이미지 설명 입력


6

@amdluigi가 말했듯이 "보통 어셈블리의 이름은 포함 된 네임 스페이스와 동일하지만 항상 그런 것은 아닙니다."

Studio의 개체 브라우저에 System.Data.dll의 위 스크린 샷이 있습니다. 여기서 문제를 탐색하는 훌륭한 예입니다. 어셈블리에 포함 된 대부분의 네임 스페이스는 System.Data 또는 System.Data의 하위 네임 스페이스입니다.

일반적으로 어셈블리 이름을 그 안의 네임 스페이스와 관련시키는 것이 좋습니다. Studio에서 어셈블리를 빌드하기위한 프로젝트를 처음 만들 때 프로젝트 속성 중 하나는 기본 네임 스페이스입니다. 처음에 Studio는 기본 네임 스페이스에 프로젝트 자체와 동일한 이름을 제공합니다. 프로젝트의 이름을 변경하기로 선택한 경우 기본 네임 스페이스도 변경하는 것이 좋습니다.

두 개의 추가 네임 스페이스가 있습니다. Microsoft.SqlServer는 이해할 수 있습니다. 별도의 어셈블리로 패키징하지 않으려는 일부 SQL Server 유형.

그러나 System.Xml은 무엇입니까 ???? System.Xml.dll 어셈블리가 있습니다. 이 네임 스페이스가 System.Data.dll에도 나타나는 이유는 무엇입니까?

어셈블리는 네임 스페이스를 다시 열고 추가 할 수 있습니다. 바로 System.Data.dll이 System.Xml 네임 스페이스로 수행하는 작업입니다.

그 이유는 네임 스페이스는 성능에 영향을 미치지 않지만 어셈블리는 매우 중요하기 때문입니다. 상당한 양의 코드가 포함 된 1000 개의 클래스가있는 경우 메모리 공간이 매우 큰 어셈블리 하나를 원하지 않습니다. 하나의 클래스가있는 1000 개의 어셈블리도 원하지 않습니다. 모든 어셈블리는 해당 내용을 실행하기 전에 메모리에로드해야합니다. 어셈블리에 적절한 수의 상호 관련된 클래스가 포함되기를 원하므로 응용 프로그램이 해당 클래스 중 하나를 얻기 위해 어셈블리를로드하면 응용 프로그램에 무료로 필요한 다른 클래스를 가져옵니다. 세분성은 중요합니다. 너무 크지도, 너무 작지도 않고, 딱 맞습니다.

System.Data.dll이 System.Xml을 다시 열고 정확히 하나의 클래스 인 XmlDataDocument를 추가합니다. 이 클래스는 관계형 데이터를 XML 문서로 해석하는 데 사용됩니다. 응용 프로그램이 XML 만 사용하는 경우이 클래스가 필요하지 않습니다. 응용 프로그램이 관계형 데이터를 처리한다면 그럴 수도 있습니다. 따라서 XmlDataDocument는 XmlDocument에서 상속되고 System.Xml 네임 스페이스에 있지만 System.Data.dll 어셈블리에 패키징됩니다.

이 모든 것은 패키지라는 하나의 개념 만있는 Java에 대한 배경 지식이있는 경우 특히 중요합니다. .NET에는 어셈블리와 네임 스페이스의 두 가지가 있습니다. 둘은 직교합니다. 어셈블리에는 분명히 둘 이상의 네임 스페이스가 포함될 수 있습니다. 어셈블리는 네임 스페이스를 다시 열고 더 추가 할 수 있습니다. 즉, 네임 스페이스의 형식은 둘 이상의 어셈블리에 걸쳐있을 수 있습니다.


3

어셈블리는 논리적 단위, 네임 스페이스, 논리적으로 클래스를 그룹화하는 물리적 그룹입니다.

네임 스페이스는 여러 어셈블리에 걸쳐있을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.