質問

.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;
    }
}

他のヒント

最善の策は、標準のVS Professional(通常はC:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include)にあるwinnt.hというCのインクルードファイルヘッダーを取得し、そこからを読み込むことです。何らかの種類のPEダンパーへのEXE、または16進ダンパーの使用。 1.オフセット0x0からDOS HEaderを見てください。 2. NTヘッダーは、DOSヘッダーの直後に続きます。 3.マシンIDは探しているものです。 CFのマシンID(ARM / MIPS)は、それぞれ0x010C / 0x0169です。もっと時間をかけて突っ込んでみたいと思うなら、読んでください。 4.次に、NTヘッダーの直後にデータディレクトリがあります。 .EXEが.NETかどうかを示すのは、15番目のデータディレクトリエントリです。 0の場合、ネイティブの.EXEです。

結合すると、実行可能ファイルが.NETでCF用かどうかを確認できます。

詳細については、こちらをご覧ください。

>

これが役立つことを願って、 宜しくお願いします、 トム。

CCIまたはCecilを使用してメタデータを解析し、依存関係のある参照セットを確認します。

http://ccimetadata.codeplex.com/

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top