어셈블리가 .NET 프레임워크의 일부인지 확인
-
09-06-2019 - |
문제
어셈블리 이름이나 어셈블리 클래스(또는 이와 유사한 다른 클래스)를 통해 어셈블리가 .그물 프레임워크(즉, System.windows.Forms
)?
지금까지 PublicKeyToken 및 CodeBase 속성을 고려했지만 전체 프레임워크에서 항상 동일한 것은 아닙니다.
이 정보가 필요한 이유는 내 EXE 파일이 사용하는 어셈블리 목록을 가져오고 클라이언트 컴퓨터에 있어야 하기 때문입니다. 그러면 Visual Studio 설치 시스템을 사용하지 않고도 설치 파일에 올바른 파일을 패키징할 수 있습니다.문제는 .NET Framework 어셈블리를 선택하고 싶지 않으며 주요 업데이트가 완료될 때마다 쉽게 롤아웃할 수 있는 자동 프로세스가 되기를 원한다는 것입니다.
궁극적인 해결책은 IsFramework 속성이 있다는 것입니다...:)
해결책
나는 가장 신뢰할 수 있고 가장 일반적인 방법이 PublicKeyToken이 될 것이라고 생각합니다.예, 둘 이상이 있지만 유한한 목록이 될 것이며 자주 변경되지 않는 목록이 될 것입니다.
그런 경우에는 어셈블리 이름에 대한 화이트리스트만 있으면 됩니다. 이 목록 역시 프레임워크 버전 간에 유한하고 정적입니다.
다른 팁
이를 달성하기 위해 AssemblyProductAttribute를 통해 어셈블리 내에 포함된 제품 이름을 사용하고 있습니다.
var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");
저는 이 기술을 사용하여 애플리케이션의 정보 화면에서 제품별로 어셈블리를 그룹화하고 있는데 제게는 잘 작동하는 것 같습니다.
나는 똑같은 문제를 다루어야했습니다.불행하게도 지금까지 제공된 모든 답변은 다음과 같습니다. 불충분하다 어셈블리가 .NET Framework의 일부인지 안전하게 확인합니다.
Microsoft는 FXAssembly
버전을 나타내는 const 문자열을 사용하여 각 프레임워크 어셈블리의 전역 네임스페이스에 추가합니다.
.class private abstract auto ansi sealed beforefieldinit FXAssembly
extends [mscorlib]System.Object
{
.field assembly static literal string Version = string('2.0.0.0')
}
이 "마커"를 사용하여 어셈블리가 프레임워크 어셈블리인지 확인하세요.공개 키를 확인하는 것도 나쁘지 않습니다.
아니요, "시스템"으로 시작하지 않습니다.프레임워크 어셈블리인 "WindowsBase"를 확인할 수 있습니다.
"기본" 키로 서명된 다른 Microsoft 어셈블리가 있지만 .NET Framework(Visual Studio 어셈블리)의 일부가 아니기 때문에 PublicKeyToken도 확인할 수 없습니다.
이를 수행하는 가장 좋은 방법은 설치된 .NET 프레임워크 컬렉션을 가져오고 대상 어셈블리가 RedistList의 일부인지 확인하는 것입니다(RedistList\FrameworkList.xml
).
FrameworkList.xml은 다음 위치에서 찾을 수 있습니다.
- .NET 2.0:C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
- .NET 3.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework\v버전번호\재등록 목록
- .NET 4.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETFramework\v버전 번호\재등록 목록
- .NET 코어:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETCore\v버전 번호\재등록 목록
GAC에 DLL이 없다는 것을 알고 있는 경우 각 어셈블리가 GAC에 있는지 여부를 확인할 수 있습니다.그렇다면 복사하지 마십시오.그렇지 않은 경우 복사하십시오.Assembly 클래스에는 GlobalAssemblyCache라는 속성이 있습니다.이것은 분명히 다른 상황보다 어떤 상황에서는 더 잘 작동할 것입니다.
Visual Studio를 설치하면 양식의 다양한 하위 폴더에 참조 어셈블리가 표시됩니다. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion}
- 가장 흥미로운 것은 아마도 RedistList\FrameworkList.xml
지정된 프레임워크 버전과 함께 제공된 모든 어셈블리 이름 목록이 포함된 파일입니다.
예: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml
.NET 4.0의 Framework 어셈블리 전체 목록이 포함되어 있는 것 같습니다.
이러한 파일을 사용하여 어셈블리의 정적 화이트리스트를 쉽게 설정할 수 있습니다.
리플렉션을 사용하여 어셈블리 게시자를 확인하고 이를 어셈블리 경로에 맞게 조정할 수 있습니다.게시자가 Microsoft이고 아래 어딘가에 존재하는 어셈블리를 찾은 경우 C:\Windows\Microsoft.NET\Framework
그것은 런타임의 일부인 것이 안전합니다.
다시 생각해 보면 출판사가 필요하지 않을 수도 있습니다.해당 경로 아래에 있는 모든 항목은 런타임의 일부여야 합니다(있어야 할 곳에서 동작하지 않는 오작동하는 애플리케이션 제외).