어셈블리(CLI)
Assembly (CLI)Microsoft가 최신 버전의 Windows에서 사용하기 위해 정의한 Common Language Infrastructure(CLI; 공통 언어 인프라) 어셈블리는 배포, 버전 관리 및 보안에 사용되는 컴파일된 코드 라이브러리입니다.프로세스 어셈블리(EXE)와 라이브러리 어셈블리(DLL)의 2종류가 있습니다.프로세스 어셈블리는 라이브러리 어셈블리에 정의된 클래스를 사용하는 프로세스를 나타냅니다.CLI 어셈블리에는 CIL에 코드가 포함되어 있습니다.CIL은 보통 CLI 언어에서 생성되며 실행 시 JIT 컴파일러에 의해 기계어로 컴파일됩니다.에서.이 컴파일러는 공통 언어 런타임(CLR)의 일부입니다.
어셈블리는 하나 이상의 파일로 구성될 수 있습니다.코드 파일은 모듈이라고 불립니다.어셈블리에 여러 코드 모듈을 포함할 수 있습니다.그리고 코드 모듈을 만들기 위해 다른 언어를 사용하는 것이 가능하기 때문에, 기술적으로 어셈블리를 만들기 위해 여러 언어를 사용하는 것이 가능합니다.그러나 Visual Studio에서는 하나의 어셈블리에서 다른 언어를 사용할 수 없습니다.
어셈블리명
어셈블리 이름은 네 부분으로 구성됩니다.
- 짧은 이름Windows 에서는, 확장자가 없는 Portable Executable(PE; 포터블 실행 파일)의 이름입니다.
- 문화.이것은 어셈블리 로케일의 RFC 1766 식별자입니다.일반적으로 라이브러리 및 프로세스 어셈블리는 문화 중립이어야 합니다. 배양은 위성 어셈블리에만 사용해야 합니다.
- 버전이는 줄자, 마이너, 빌드 및 리비전의 4가지 값으로 이루어진 점수입니다.
- 공개 키 토큰이것은 어셈블리 서명에 사용되는[1] 개인 키에 대응하는 공개 키의 64비트 해시입니다.서명된 집회는 강력한 이름을 가지고 있다고 한다.
공개 키 토큰은 어셈블리 이름을 고유하게 만드는 데 사용됩니다.따라서 두 개의 강력한 이름 있는 어셈블리가 동일한 PE 파일 이름을 가질 수 있지만 CLI는 이들을 다른 어셈블리로 인식합니다.Windows 파일 시스템(FAT32 및 NTFS)은 PE 파일 이름만 인식하므로 동일한 PE 파일 이름(단, 다른 문화, 버전 또는 공개 키 토큰)을 가진 두 개의 어셈블리를 동일한 Windows 폴더에 둘 수 없습니다.이 문제를 해결하기 위해 CLI는 런타임에 단일 폴더로 처리되지만 실제로는 중첩된 파일 시스템 폴더를 사용하여 구현되는 GAC(Global Assembly Cache)를 도입합니다.
크래커가 다른 것으로 보이는 어셈블리를 전달하려고 하는 스푸핑 공격을 방지하기 위해 어셈블리는 개인 키로 서명됩니다.의도된 어셈블리의 개발자는 개인 키를 비밀로 유지하므로 크래커가 개인 키에 액세스하거나 단순히 추측할 수 없습니다.따라서 크래커는 변경 후 올바르게 서명할 수 없기 때문에 자신의 조립체가 다른 무언가를 가장하도록 만들 수 없습니다.어셈블리에 서명하려면 어셈블리의 중요한 부분을 해시하고 개인 키로 해시를 암호화해야 합니다.서명된 해시는 공용 키와 함께 어셈블리에 저장됩니다.공용 키는 서명된 해시를 해독합니다.CLR은 강력한 이름의 어셈블리를 로드하면 어셈블리에서 해시를 생성하고 이를 복호화된 해시와 비교합니다.비교가 성공하면 파일 내의 공개 키(및 공개 키 토큰)가 어셈블리 서명에 사용되는 개인 키와 관련되어 있음을 의미합니다.이는 어셈블리 내의 공개 키가 어셈블리 퍼블리셔의 공개 키이므로 스푸핑 공격이 방지됨을 의미합니다.
어셈블리 버전
CLI 어셈블리는 버전 정보를 가질 수 있으므로 공유 [2]어셈블리로 인해 발생하는 응용 프로그램 간의 충돌을 대부분 제거할 수 있습니다.그러나 [3]이 방법으로 어셈블리 간에 발생할 수 있는 모든 버전 충돌이 제거되는 것은 아닙니다.
어셈블리 및 CLI 보안
CLI 코드 액세스 보안은 어셈블리 및 증거를 기반으로 합니다.증거는 어셈블리에서 추론된 모든 것이 될 수 있지만 일반적으로 어셈블리의 소스에서 작성됩니다.이거는 어셈블리가 인터넷, 인트라넷 또는 로컬머신에서 다운로드되었는지 여부에 관계없이 작성됩니다(어셈블리가 다른 머신에서 다운로드된 경우 GAC 내의 샌드박스된 위치에 저장되므로 처리되지 않습니다.로컬에 인스톨 되고 있는 경우).사용 권한은 전체 어셈블리에 적용되며 어셈블리는 사용자 지정 특성을 통해 필요한 최소 사용 권한을 지정할 수 있습니다(CLI 메타데이터 참조).어셈블리가 로드되면 CLR은 어셈블리의 증거를 사용하여 하나 이상의 코드 액세스 권한으로 구성된 권한 세트를 만듭니다.그런 다음 CLR은 이 권한 세트에 어셈블리에서 지정된 필수 권한이 포함되어 있는지 확인합니다.
CLI 코드는 코드 액세스보안 요구를 실행할 수 있습니다.즉, 콜 스택 내의 모든 메서드의 어셈블리가 지정된 권한을 가지고 있는 경우에만 코드가 몇 가지 특권 액션을 수행합니다.하나의 어셈블리에 권한이 없는 경우 보안 예외가 느려집니다.
CLI 코드는 콜스택에서 권한을 취득하기 위해 Linked Demand를 실행할 수도 있습니다.이 경우 CLR은 지정된 권한에 대해 TOP 위치에 있는 콜스택 내의 메서드를 1개만 조사합니다.여기서 스택 워크스루는 콜스택 내의 다른 모든 메서드가 지정된 권한을 가지고 있다고 CLR이 가정하는 콜스택 내의 하나의 메서드에 바인드됩니다.어셈블리는 메타데이터와 MSIL 파일의 조합입니다.
위성 어셈블리
일반적으로 어셈블리는 문화 중립적인 자원을 포함해야 합니다.어셈블리를 현지화하려면(예를 들어 다른 로케일에 대해 다른 문자열을 사용함) 새틀라이트 어셈블리를 사용해야 합니다(특수한 리소스 전용 어셈블리).이름에서 알 수 있듯이, 위성은 메인 어셈블리라고 불리는 어셈블리와 연관되어 있다.이 어셈블리(lib.dll 등)에는 중립적인 자원(Microsoft가 말하는 국제 영어이지만 미국 영어임을 함축)이 포함됩니다.각 위성에는 .resources가 부가된 관련 라이브러리 이름(예를 들어 lib.resources.dll)이 있습니다.위성에는 중립적이지 않은 문화 이름이 지정되지만 기존 Windows 파일 시스템(FAT32 및 NTFS)에서는 이 이름이 무시되므로 하나의 폴더에 동일한 PE 이름을 가진 파일이 여러 개 있을 수 있습니다.이 작업을 수행할 수 없으므로 위성은 응용 프로그램 폴더 아래의 하위 폴더에 저장해야 합니다.예를 들어, 영국 영어 리소스를 사용하는 위성의 CLI 이름은 "lib.block Version=0.0.0 Culture=en-GB PublicKey"입니다.Token=syslog"는 lib.syslog.syslog의 PE 파일 이름으로, en-GB라는 하위 폴더에 저장됩니다.
위성은 다음과 같은 CLI 클래스에 의해 로드됩니다.System.Resources.ResourceManager
개발자는 자원의 이름과 메인 어셈블리에 대한 정보(중립 자원 포함)를 제공해야 합니다.ResourceManager 클래스는 머신의 로케일을 읽고 이 정보와 메인어셈블리의 이름을 사용하여 위성 이름과 이를 포함하는 하위 폴더의 이름을 가져옵니다. ResourceManager
그러면 위성을 로드하여 현지화된 리소스를 얻을 수 있습니다.
어셈블리 참조
C# 컴파일러의 /reference 플래그를 사용하여 실행 가능한 코드 라이브러리를 참조할 수 있습니다.
어셈블리의 지연 서명
공유 어셈블리는 응용 프로그램 간에 공유될 수 있는 어셈블리를 고유하게 식별하기 위해 강력한 이름을 지정해야 합니다.강력한 이름은 공개 키 토큰, 문화, 버전 및 PE 파일 이름으로 구성됩니다.어셈블리가 공유 어셈블리인 개발 목적으로 사용될 가능성이 높은 경우 강력한 명명 절차에는 공개 키 생성만 포함됩니다.이때 개인 키는 생성되지 않습니다.어셈블리가 배포된 경우에만 생성됩니다.
어셈블리의 언어
어셈블리는 중간 언어인 CIL 코드를 사용하여 구축됩니다.프레임워크는 내부적으로 CIL(바이트 코드)을 네이티브어셈블리 코드로 변환합니다.「Hello World」를 인쇄하는 프로그램이 있는 경우, 이 메서드에 대응하는 CIL 코드는 다음과 같습니다.
.방법 사적인 숨김 정적인 무효 주된(스트링[] args) 카일 관리되는. { .진입점 .관습 사례 무효 [mscorlib]시스템..STAThread Attribute::.모니터() = ( 01 00 00 00 ) // 코드 사이즈 11 (0xb) .최대 스택 1 IL_0000: ldstr '헬로 월드' IL_0005: 불러 무효 [mscorlib]시스템..콘솔::기입선(스트링) IL_000a: 리트 } // 메서드 Class1의 끝:: 메인
CIL 코드는 String을 스택에 로드하고 WriteLine 함수를 호출하여 반환합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ 를 제공하다.NET Assembly a strong name
- ^ Truche, Philippe (12 August 2008). ".NET Assembly Versioning Lifecycle". Archived from the original on 24 October 2008. Retrieved 21 September 2008.
- ^ Pierson, Harry (17 September 2008). "DLR Namespace Change Fire Drill". Archived from the original on 1 November 2008. Retrieved 21 September 2008.