GAC 사용의 장점과 단점은 무엇입니까?
게다가 전역 어셈블리 캐시를 사용해야하는 경우 나 사용할 수없는 경우가 있습니까?
- GAC에서 어셈블리를로드하면 응용 프로그램이 항상 올바른 버전의 .NET 라이브러리를로드하는 오버 헤드와 보안이 줄어 듭니다.
- GAC 외부에있는 어셈블리를 ngen하면 안됩니다. 성능 향상이 거의 없을 것이기 때문입니다. 대부분의 경우 성능이 저하되기도합니다.
- 모든 표준 .NET 어셈블리가 실제로 GAC에 있고 설치 중이기 때문에 이미 GAC를 사용하고 있습니다.
- 자체 라이브러리에 GAC를 사용하면 배포가 복잡해 지므로 어떤 대가를 치르더라도이를 피하려고합니다.
- GAC에 무언가를 넣으려면 설치하는 동안 사용자가 관리자로 로그인해야합니다. 이는 여러 유형의 응용 프로그램에서 상당히 문제가됩니다.
따라서 모든 것을 요약하면 간단하게 시작하고 나중에 어셈블리를 GAC 및 NGEN에 넣으면 성능이 크게 향상되는 것을 볼 수 있습니다. 그렇지 않으면 신경 쓰지 마십시오. GAC는 더 많은 애플리케이션간에 라이브러리가 공유 될 것으로 예상되는 프레임 워크에 더 적합합니다. 99 %의 경우에는 필요하지 않습니다.
이점:
- 어셈블리를 업데이트 할 수있는 유일한 곳
- 하드 드라이브 공간을 조금 덜 사용합니다.
불리:
- 하나의 웹 사이트 만 업데이트해야하는 경우 업데이트 할 수 없습니다. 웹 서버의 다른 웹 사이트가 깨져서 끝날 수 있습니다.
권장 사항 : GAC는 MS와 친구들에게 맡기십시오. 현재 기가 바이트는 매우 저렴합니다.
GAC는 신뢰할 수없는 코드 (예 : 부분 신뢰 ASP.NET 응용 프로그램)를 대신하여 권한있는 작업을 수행하기 위해 상승 된 권한이 필요한 어셈블리에서도 사용할 수 있습니다.
예를 들어, 상승 된 권한이 필요한 작업을 수행해야하는 부분 신뢰 ASP.NET 응용 프로그램이 있다고 가정합니다 (예 : 완전 신뢰) . 해결책은 상승 된 권한이 필요한 코드를 별도의 어셈블리에 넣는 것입니다. 어셈블리는 AllowPartiallyTrustedCallers
특성 으로 표시되고 권한있는 논리를 포함하는 클래스는 다음과 같이 PermissionSet 특성으로 표시됩니다.
[PermissionSet(SecurityAction.Assert, Unrestricted=true)]
어셈블리에 강력한 이름 (서명 됨)이 지정된 다음 GAC에 배포됩니다.
이제 부분적으로 신뢰할 수있는 앱은 GAC의 신뢰할 수있는 어셈블리를 활용하여 부분 신뢰의 이점을 잃지 않고 특정하고 좁은 권한있는 작업 집합을 수행 할 수 있습니다.
GAC는 완전 신뢰로 실행되며 웹 앱 외부의 애플리케이션에서 사용할 수 있습니다. 예를 들어, sptimer 서비스는 별도의 프로세스이기 때문에 Sharepoint의 타이머 작업은 GAC에 있어야합니다.
"완전 신뢰"부분은 보안 문제의 가능한 소스이기도합니다. 물론 코드 액세스 보안으로 작업 할 수 있지만 불행히도 CAS를 사용하는 어셈블리가 너무 많지는 않습니다. / bin 폴더는 보통 괜찮은 보통으로 잠글 수 있습니다.
Daniel Larson은 CAS에 대한 게시물을 통해 차이점을 좀 더 자세히 설명합니다.
여러 어셈블리로 구성된 재사용 가능한 라이브러리를 제공하지만 그중 몇 개만 파사드를 형성하는 경우 패키지가 개발자의 PC에 설치된 경우 어셈블리를 GAC에 설치하는 것을 고려할 수 있습니다.
6 개의 어셈블리를 배송하고이 6 개의 어셈블리 중 하나만 파사드를 포함한다고 상상해보십시오. 즉, 나머지 5 개는 파사드 자체에서만 사용됩니다. 배송 :
- MyProduct.Facade.dll- 개발자가 사용하도록 고안된 유일한 구성 요소입니다.
- MyProduct.Core.dll-MyProduct.Facade.dll에서 사용하지만 개발자는 사용할 수 없습니다.
- MyProduct.Component1.dll-동일
- MyProduct.Component2.dll-동일
- ThirdParty.Lib1.dll-MyProduct.Component1.dll에서 사용하는 타사 라이브러리
- ThirdParty.Lib2.dll-동일
- 기타
프로젝트를 사용하는 개발자 는 자신의 프로젝트에서 MyProduct.Facade.dll 만 참조 하려고합니다. 그러나 프로젝트가 실행되면 참조하는 모든 어셈블리를 재귀 적으로로드 할 수 있어야합니다. 이것이 어떻게 달성 될 수 있습니까? 일반적으로 GAC의 Bin 폴더에서 사용할 수 있어야합니다.
- 개발자에게 설치 폴더를 찾고 거기에 넣은 모든 N 어셈블리에 대한 참조를 추가 하도록 요청할 수 있습니다 . 이렇게하면 런타임에 사용할 수 있도록 Bin 폴더에 복사됩니다.
- 이 6 개의 참조가 이미 포함 된 VS.NET 프로젝트 템플릿을 설치할 수 있습니다 . 설치 전에이 템플릿에 어셈블리의 실제 경로를 삽입 해야하므로 약간 복잡 합니다. 이 경로는 설치 경로에 따라 다르므로 설치 프로그램에서만 수행 할 수 있습니다.
- 개발자에게 필요한 종속성을 Bin 폴더에 복사하는 .csproj / .vbproj 파일에 특수 빌드 후 단계 를 만들 도록 요청할 수 있습니다 . 동일한 단점.
- 마지막으로 모든 어셈블리를 GAC에 설치할 수 있습니다 . 이 경우 개발자는 프로젝트에서 MyProduct.Facade.dll에 대한 참조 만 추가해야합니다. 어쨌든 다른 모든 것은 런타임에서 사용할 수 있습니다.
참고 : 마지막 옵션은 프로젝트를 프로덕션 PC로 배송하는 동안 동일한 작업을 수행하도록 만들지 않습니다. Bin 폴더 내의 모든 어셈블리를 배송하거나 GAC에 설치할 수 있습니다. 모두 원하는대로 다릅니다.
따라서 설명 된 솔루션은 개발 중에 타사 어셈블리를 GAC에 넣는 이점을 보여줍니다. 생산과 관련이 없습니다.
아시다시피 GAC에 설치하는 것은 주로 필요한 어셈블리 (종속성)의 위치 문제를 해결하기위한 것입니다. 어셈블리가 GAC에 설치되는 경우 모든 응용 프로그램 "근처"에 존재한다고 생각할 수 있습니다. PATH 변수에 .exe 경로를 추가하는 것과 같지만 "관리되는 방식"입니다. -물론 이것은 다소 간단한 설명입니다.)
GAC 사용의 가장 큰 장점 중 하나는 동일한 어셈블리의 여러 버전을 등록하고 응용 프로그램에 사용할 수 있다는 것입니다. 개인적으로 나는 그것이 기계에서 기계로의 이동을 제한하는 방법을 좋아하지 않습니다 (나는 무언가를 등록해야하기 때문에 새로운 VPC에서 소스를 확인하고 실행하기 위해 여러 단계를 거치는 것을 말하는 것을 좋아하지 않습니다. GAC)
In all my life, I have had maybe one application where I had to put an assembly in the GAC, simply because these assemblies were part of a framework that a number of applications would use it, and it seemed right to put them into the GAC.
ReferenceURL : https://stackoverflow.com/questions/23578/what-are-the-advantages-and-disadvantages-of-using-the-gac
'programing' 카테고리의 다른 글
팬더 플롯이 표시되지 않음 (0) | 2021.01.19 |
---|---|
Typescript-확장 오류 클래스 (0) | 2021.01.19 |
Mercurial : 명령 줄에 여러 줄 커밋 메시지가 표시됩니까? (0) | 2021.01.19 |
부등식 연산자가 같음 연산자보다 빠릅니까? (0) | 2021.01.19 |
Objective-C에서 별표 배치 (0) | 2021.01.19 |