方法: イメージがネイティブであるか CLR であるかを確認する
共通言語ランタイム用にイメージがビルドされたかどうかを判断する 1 つの方法は、 dumpbin /CLRHEADER
コマンドを使用することです。 詳細については、/CLRHEADER
を参照してください。
共通言語ランタイムにイメージがビルドされたかどうかをプログラムで確認することもできます。 詳細については、「 方法: /clr コンパイルを検出する」を参照してください。
例
次の例では、イメージが共通言語ランタイムで実行するためにビルドされたかどうかを確認します。
// detect_image_type.cpp
// compile with: /clr
using namespace System;
using namespace System::IO;
enum class CompilationMode {Invalid, Native, CLR };
static CompilationMode IsManaged(String^ filename) {
try {
array<Byte>^ data = gcnew array<Byte>(4096);
FileInfo^ file = gcnew FileInfo(filename);
Stream^ fin = file->Open(FileMode::Open, FileAccess::Read);
Int32 iRead = fin->Read(data, 0, 4096);
fin->Close();
// Verify this is a executable/dll
if ((data[1] << 8 | data[0]) != 0x5a4d)
return CompilationMode::Invalid;
// This will get the address for the WinNT header
Int32 iWinNTHdr = data[63]<<24 | data[62]<<16 | data[61] << 8 | data[60];
// Verify this is an NT address
if ((data[iWinNTHdr+3] << 24 | data[iWinNTHdr+2] << 16 | data[iWinNTHdr+1] << 8 | data[iWinNTHdr]) != 0x00004550)
return CompilationMode::Invalid;
Int32 iLightningAddr = iWinNTHdr + 24 + 208;
Int32 iSum = 0;
Int32 iTop = iLightningAddr + 8;
for (int i = iLightningAddr; i < iTop; ++i)
iSum |= data[i];
if (iSum == 0)
return CompilationMode::Native;
else
return CompilationMode::CLR;
}
catch(Exception ^e) {
throw(e);
}
}
int main() {
array<String^>^ args = Environment::GetCommandLineArgs();
if (args->Length < 2) {
Console::WriteLine("USAGE : detect_clr <assembly_name>\n");
return -1;
}
Console::WriteLine("{0} is compiled {1}", args[1], IsManaged(args[1]));
}