문제

.NET 어셈블리가 있으므로 .NET CF 또는 전체 프레임 워크를 위해 구축되었는지 여부를 어떻게 감지 할 수 있습니까?

도움이 되었습니까?

해결책

아주 간단합니다.

public enum AssemblyType
{
    CompactFramework,
    FullFramework,
    NativeBinary
}

public AssemblyType GetAssemblyType(string pathToAssembly)
{
    try
    {
        Assembly asm = Assembly.LoadFrom(pathToAssembly);
        var mscorlib = asm.GetReferencedAssemblies().FirstOrDefault(a => string.Compare(a.Name, "mscorlib", true) == 0);
        ulong token = BitConverter.ToUInt64(mscorlib.GetPublicKeyToken(), 0);

        switch (token)
        {
            case 0xac22333d05b89d96:
                return AssemblyType.CompactFramework;
            case 0x89e03419565c7ab7:
                return AssemblyType.FullFramework;
            default:
                throw new NotSupportedException();
        }
    }
    catch (BadImageFormatException)
    {
        return AssemblyType.NativeBinary;
    }
}

다른 팁

가장 좋은 방법은 표준 대 전문가 (일반적으로 C : Program Files Microsoft Visual Studio 9.0 VC Include)에서 발견 된 Winnt.h라는 파일 헤더를 포함하는 것입니다. 어떤 종류의 PE Dumper 또는 육각 더퍼를 사용하십시오. 1. 오프셋 0x0의 DOS 헤더를보십시오. 2. NT 헤더는 DOS 헤더 후 즉시 따라갑니다. 3. 기계 ID는 당신이 찾고있는 것입니다. CF (ARM/MIPS)의 기계 ID는 각각 0x010c/0x0169입니다. 주위를 찌르는 데 더 많은 시간을 투자하려면 .. 읽기, 4. 그러면 NT 헤더 후 바로 다음 데이터 디렉토리가 있습니다. 15 번째 데이터 디렉토리 항목은 .exe가 .NET인지 여부를 나타내는 것입니다. 0이라면 네이티브 .exe입니다.

그런 다음 실행 파일이 .NET인지, CF의 경우를 알 수 있습니다.

바라보다 여기 자세한 사항은.

이것이 도움이되기를 바랍니다.

차라리 CCI 또는 Cecil을 사용하여 메타 데이터를 구문 분석하고 어떤 참조 세트에 의존하는지 확인합니다.

http://ccimetadata.codeplex.com/

http://www.mono-project.com/cecil

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