문제

어셈블리 이름이나 어셈블리 클래스(또는 이와 유사한 다른 클래스)를 통해 어셈블리가 .그물 프레임워크(즉, 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 그것은 런타임의 일부인 것이 안전합니다.

다시 생각해 보면 출판사가 필요하지 않을 수도 있습니다.해당 경로 아래에 있는 모든 항목은 런타임의 일부여야 합니다(있어야 할 곳에서 동작하지 않는 오작동하는 애플리케이션 제외).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top