C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: CPUタイプを判別する方法


(過去ログ 146 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■85310 / inTopicNo.1)  CPUタイプを判別する方法
  
□投稿者/ 餓狼 (1回)-(2017/10/06(Fri) 10:39:30)

分類:[.NET 全般] 

VB.NETでビルドした
実行中のプログラムのCPUタイプが
x86かx64か、AnyCPUのどれでビルドされたかを
プログラム内で調べたいのですが
どのようにすれば良いですか?

あと、AnyCPUでビルドされた場合で
実際には、x86とx64のどちらで実行されているかを調べる方法も教えてください。
 
引用返信 編集キー/
■85311 / inTopicNo.2)  Re[1]: CPUタイプを判別する方法
□投稿者/ Jitta (320回)-(2017/10/06(Fri) 11:00:13)
No85310 (餓狼 さん) に返信
> VB.NETでビルドした
> 実行中のプログラムのCPUタイプが
> x86かx64か、AnyCPUのどれでビルドされたかを
> プログラム内で調べたいのですが
> どのようにすれば良いですか?

.NET Framework アプリの仕組み的に無理だと思います。



>
> あと、AnyCPUでビルドされた場合で
> 実際には、x86とx64のどちらで実行されているかを調べる方法も教えてください。
>  
intPtr 型の幅を調べればいいと思います。
引用返信 編集キー/
■85312 / inTopicNo.3)  Re[2]: CPUタイプを判別する方法
□投稿者/ 餓狼 (2回)-(2017/10/06(Fri) 11:14:47)
No85311 (Jitta さん) に返信

ありがとうございます。

intPtr 型の幅を調べるというのは
どのようなコードで書けますか?
よろしくお願いいたします。
 
引用返信 編集キー/
■85313 / inTopicNo.4)  Re[3]: CPUタイプを判別する方法
□投稿者/ Hongliang (570回)-(2017/10/06(Fri) 11:19:38)
IntPtr.Size静的プロパティが4を返すか8を返すか、ですね。
引用返信 編集キー/
■85314 / inTopicNo.5)  Re[3]: CPUタイプを判別する方法
□投稿者/ 餓狼 (3回)-(2017/10/06(Fri) 11:19:57)
https://dobon.net/vb/dotnet/system/is64bit.html

解決しました
ありがとうございます。
 
解決済み
引用返信 編集キー/
■85317 / inTopicNo.6)  Re[4]: CPUタイプを判別する方法
□投稿者/ 魔界の仮面弁士 (1422回)-(2017/10/06(Fri) 12:18:40)
2017/10/06(Fri) 17:44:51 編集(投稿者)

No85314 (餓狼 さん) に返信
> https://dobon.net/vb/dotnet/system/is64bit.html
> 解決しました

自プロセスに対して判断する場合は、上記の手法が一般的ですね。

ちなみに、アセンブリ(EXE や DLL)から調査する場合は
 CorFlags WindowsApplication1.exe
 CorFlags Library1.dll
のようにして確認できます。


=== 以下蛇足 ===

【VS2012 以上に付属の CorFlags の場合】
PE = PE32+ および 32BITREQ = 0 および 32BITPREF = 0 → x64 ビルド
PE = PE32 および 32BITREQ = 1 および 32BITPREF = 0 → x86 ビルド
PE = PE32 および 32BITREQ = 0 および 32BITPREF = 1 → Any CPU (32 ビットの優先: On) ビルド
PE = PE32 および 32BITREQ = 0 および 32BITPREF = 0 → Any CPU (32 ビットの優先: Off) ビルド

【VS2010 以下に付属の CorFlags の場合】
PE = PE32+ および 32BIT = 0 → x64 ビルド
PE = PE32 および 32BIT = 1 → x86 ビルド
PE = PE32 および 32BIT = 0 → Any CPU ビルド


VS2012 以降で追加された "32 ビットの優先" フラグの状態を
VS2010 以下の CorFlags.exe で判定したい場合は、
"CorFlags" フィールドの値を確認してみてください。
たとえば 131075 (0x20003) が得られた場合には
32 ビットの優先 On な AnyCPU としてビルドされています。


ツールに頼らず、直接 PE ヘッダーを読み取る場合はこのあたり。

IMAGE_FILE_HEADER.Machine
 0x014c (IMAGE_FILE_MACHINE_I386) x86
 0x0200 (IMAGE_FILE_MACHINE_IA64) Intel Itanium
 0x8664 (IMAGE_FILE_MACHINE_AMD64) x64

IMAGE_OPTIONAL_HEADER32.Magic / IMAGE_NT_OPTIONAL_HDR64_MAGIC.Magic
 0x10b (IMAGE_NT_OPTIONAL_HDR32_MAGIC) PE32
 0x20b (IMAGE_NT_OPTIONAL_HDR64_MAGIC) PE32+


"32bit の優先" の方は、CLR ヘッダーから CorFlags を読むことになりそう。
(IMAGE_COR20_HEADER.Flags)
https://jstdev.wordpress.com/2014/02/16/clr-header/
https://qiita.com/katabamisan/items/ae94ff3b582dd42de44a

=== 追記 ===
以下、[corhdr.h] より。

0x00000001: COMIMAGE_FLAGS_ILONLY
0x00000002: COMIMAGE_FLAGS_32BITREQUIRED
0x00000004: COMIMAGE_FLAGS_IL_LIBRARY
0x00000008: COMIMAGE_FLAGS_STRONGNAMESIGNED
0x00000010: COMIMAGE_FLAGS_NATIVE_ENTRYPOINT
0x00010000: COMIMAGE_FLAGS_TRACKDEBUGDATA
0x00020000: COMIMAGE_FLAGS_32BITPREFERRED
解決済み
引用返信 編集キー/
■85353 / inTopicNo.7)  Re[4]: CPUタイプを判別する方法
□投稿者/ 餓狼 (4回)-(2017/10/12(Thu) 18:14:57)
ありがとうございます。

CorFlags

というのはどのようにして読み込めば良いのですか?
もう少し具体的なコードを提示していただけないでしょうか?
 
引用返信 編集キー/
■85356 / inTopicNo.8)  Re[5]: CPUタイプを判別する方法
□投稿者/ Azulean (877回)-(2017/10/12(Thu) 22:58:21)
No85353 (餓狼 さん) に返信
> CorFlags
>
> というのはどのようにして読み込めば良いのですか?
> もう少し具体的なコードを提示していただけないでしょうか?

そのコードを書き下ろすのはベテランであっても数分レベルではないと思います。

たとえば、下記で C++ で書かれているコードを C# or VB.NET に書き直し、途中に出てくる構造体をすべて自分で C# or VB.NET に変換して定義していくか、P/Invoke.NET など、すでに書き換えた事例を探すなどして組み立てる必要があります。
http://www.codeguru.com/cpp/w-p/dll/openfaq/article.php/c14001/Determining-Whether-a-DLL-or-EXE-Is-a-Managed-Component.htm

まあ、一仕事ですね…。
引用返信 編集キー/
■85360 / inTopicNo.9)  Re[5]: CPUタイプを判別する方法
□投稿者/ 魔界の仮面弁士 (1424回)-(2017/10/13(Fri) 09:43:14)
2017/10/13(Fri) 10:04:11 編集(投稿者)

No85353 (餓狼 さん) に返信
> CorFlags
> というのはどのようにして読み込めば良いのですか?

CorFlags.exe ツールを起動して、標準出力を取り出してみるのは如何でしょうか。


直接的に読み取りたいというのであれば、searchcode で検索したみたところ、
下記の C# コードが見つかりましたので、コンパイルしてから参照設定で使うか、
VB に翻訳して取り込むかしてみてください。
https://searchcode.com/codesearch/view/27987508/


なお、VB から呼び出す場合は、上記を参照設定に加えた上でこんな感じ。

Imports ApiChange.Api.Introspection
Module Module1
 Sub Main(args$())
  For Each f In args
   Console.WriteLine(f)

   Dim meta = CorFlagsReader.ReadAssemblyMetadata(f)
   If meta Is Nothing Then Continue For
   Console.WriteLine("IsPureIL={0}", meta.IsPureIL)
   Console.WriteLine("IsSigned={0}", meta.IsSigned)
   Console.WriteLine("CLR={0}.{1}", meta.MajorRuntimeVersion, meta.MinorRuntimeVersion)
   Console.WriteLine("ProcessorArchitecture={0}", meta.ProcessorArchitecture)
   Console.WriteLine()
  Next
  Console.Write("Hit Enter Key...")
  Console.ReadKey()
 End Sub
End Module


今回紹介した、CorFlagsReader サンプルには、32bit優先フラグの有無を見るための
プロパティは用意されていません。とはいえ、判定に必要なビットフラグは
No85317 で紹介済みですから、書き換えるのはそう難しく無いでしょう。


--- 追記:DLL 改修案 ---
public bool IsPreferred32bit
{
 get
 {
   return (corflags & CorFlags.F32BitsPreferred)
      == CorFlags.F32BitsPreferred;
 }
}


[Flags]
private enum CorFlags : uint
{
  F32BitsRequired = 2,
  ILOnly = 1,
  StrongNameSigned = 8,
  TrackDebugData = 0x10000,
  F32BitsPreferred = 0x20000, // ★追加
}
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -