トップ回答者
開発環境がインストールされていない環境で、動作させるアプリケーションの動作バージョンを確認したい

質問
-
C++cliを用いてアプリケーションを作成しています。
開発環境では、動作しているアプリケーションの使用している .Net Framework version を調べることができます。
開発環境がインストールされていない環境(端末)で、動作しているアプリケーションの使用している .Net Framework version を調べる方法はあるのでしょうか?
開発環境がインストールされていない環境は、スタンドアローンのWindows 7 pro x64 です。
*背景
.Net Framework 4 が標準でインストールされていたが、動作確認のため.Net Framework 4.6.2をインストールした。
その後.Net Framework 4.6.2をアンインストールしたが、起動速度等動作が変わっているように感じるため調査しようと考えています。
どうぞよろしくお願いいたします。
回答
-
失礼しました。EXEの使う.NET Frameworkのバージョンですね。以下の質問が近いと思いますが、やはりSDKや開発環境のツールが必要のようですね。
https://social.msdn.microsoft.com/Forums/ja-JP/6937ac95-8470-4a3c-a34d-ccc76582c5fe
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月12日 1:17
- 回答としてマーク kkfuku 2016年12月13日 10:04
-
挙げられたclrverコマンドでは 1.0 / 1.1 / 2.0 / 4.0 の判定しか行いません。そこで.NET Frameworkの各バージョンについて説明します。
- 1.0
各サービスパック(SP)は上書き形式で、コンピューターにインストールされているバージョンを確認することで特定できます。 - 1.1
各SPは上書き形式で、コンピューターにインストールされているバージョンを確認することで特定できます。 - 2.0
各SPは上書き形式で、特定可能です。 - 3.0
2.0へ追記形式でインストールされるため、アプリケーションが当該DLLを読み込むようプログラムされているかで決まります。
各SPは上書き形式で、特定可能です。 - 3.5
2.0 + 3.0へ追記形式でインストールされるため、アプリケーションが当該DLLを読み込むかどうか。 - 4.x
各バージョンは上書き形式で、コンピューターにインストールされているバージョンを確認することで特定できます。
このため、clrverコマンドでバージョンを判定できれば、後はインストール状況およびプログラムによって詳細なバージョンを特定可能です。
ちなみに.NET Frameworkアプリケーションはアプリケーション構成ファイルにて使用する.NET Frameworkバージョンを指定することができるため、実行時に使用されるバージョンを推定することができます。アプリケーション構成ファイルが存在しない、もしくは記述されていない場合、コンパイラーバージョンによって次のようになります。
- Visual C++ .NET 2002 → 1.0
- Visual C++ .NET 2003 → 1.1
- Visual C++ 2005 / 2008 → 2.0
- Visual C++ 2010以降 → 4.0
となります。
結局、明示的に指定していない場合は使用したコンパイラーで決まるので、そこをまずは提示してください。また、本題は起動速度であって読み込まれたバージョンはあまり関係ないのではと思います。
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月12日 1:16
- 回答としてマーク kkfuku 2016年12月13日 10:04
- 1.0
-
kkfuku さま よろしく。
もし、該当アプリにコードを付加出来るのなら、
.exe が参照する .Netframework の mscorlib.dll のファイルのバージョン番号は取得出来ると思いますが。
一般的な構成なら、C:\Windows\Microsoft.NET\Framework\v4.0.30319\ の Directory に格納されたものです。
例えば、 4.6.1586.0 等の値が返ります。 major-minor-build-revision です。
4.6.1 や 4.6.2 等の通常表記と異なりますが。
尚、佐祐理 さまも書いてらっしゃるのですが、.Netframework 4.x 系は上書きインストールですから、バージョンを元に戻しても、削除再構成 の手順が入り、
以前とは異なる配置(FileSystem 上)になっているのではないですか?。また、4.x 系は必ずひとつしか存在しない事を考えれば、Kenjinote さまのお書きになったレジストリから算出する方法が microsoft の推奨する方法なのだと思います。
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月12日 1:16
- 回答としてマーク kkfuku 2016年12月13日 10:04
すべての返信
-
レジストリの値
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full以下を調べることにより、インストールされている.NET Frameworkのバージョンを調べることができるようです。
詳しくは下記のサイトに、レジストリの値とバージョンの対応表が乗っておりました。
https://msdn.microsoft.com/ja-jp/library/hh925568(v=vs.110).aspx
追伸: .NET Framework 4.6.2については、上記の日本語のページには記載がありませんが、英語のページで記載されておりました。ご確認ください。
https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx
- 編集済み kenjinoteMVP 2016年12月8日 10:03
-
失礼しました。EXEの使う.NET Frameworkのバージョンですね。以下の質問が近いと思いますが、やはりSDKや開発環境のツールが必要のようですね。
https://social.msdn.microsoft.com/Forums/ja-JP/6937ac95-8470-4a3c-a34d-ccc76582c5fe
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月12日 1:17
- 回答としてマーク kkfuku 2016年12月13日 10:04
-
挙げられたclrverコマンドでは 1.0 / 1.1 / 2.0 / 4.0 の判定しか行いません。そこで.NET Frameworkの各バージョンについて説明します。
- 1.0
各サービスパック(SP)は上書き形式で、コンピューターにインストールされているバージョンを確認することで特定できます。 - 1.1
各SPは上書き形式で、コンピューターにインストールされているバージョンを確認することで特定できます。 - 2.0
各SPは上書き形式で、特定可能です。 - 3.0
2.0へ追記形式でインストールされるため、アプリケーションが当該DLLを読み込むようプログラムされているかで決まります。
各SPは上書き形式で、特定可能です。 - 3.5
2.0 + 3.0へ追記形式でインストールされるため、アプリケーションが当該DLLを読み込むかどうか。 - 4.x
各バージョンは上書き形式で、コンピューターにインストールされているバージョンを確認することで特定できます。
このため、clrverコマンドでバージョンを判定できれば、後はインストール状況およびプログラムによって詳細なバージョンを特定可能です。
ちなみに.NET Frameworkアプリケーションはアプリケーション構成ファイルにて使用する.NET Frameworkバージョンを指定することができるため、実行時に使用されるバージョンを推定することができます。アプリケーション構成ファイルが存在しない、もしくは記述されていない場合、コンパイラーバージョンによって次のようになります。
- Visual C++ .NET 2002 → 1.0
- Visual C++ .NET 2003 → 1.1
- Visual C++ 2005 / 2008 → 2.0
- Visual C++ 2010以降 → 4.0
となります。
結局、明示的に指定していない場合は使用したコンパイラーで決まるので、そこをまずは提示してください。また、本題は起動速度であって読み込まれたバージョンはあまり関係ないのではと思います。
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月12日 1:16
- 回答としてマーク kkfuku 2016年12月13日 10:04
- 1.0
-
kkfuku さま よろしく。
もし、該当アプリにコードを付加出来るのなら、
.exe が参照する .Netframework の mscorlib.dll のファイルのバージョン番号は取得出来ると思いますが。
一般的な構成なら、C:\Windows\Microsoft.NET\Framework\v4.0.30319\ の Directory に格納されたものです。
例えば、 4.6.1586.0 等の値が返ります。 major-minor-build-revision です。
4.6.1 や 4.6.2 等の通常表記と異なりますが。
尚、佐祐理 さまも書いてらっしゃるのですが、.Netframework 4.x 系は上書きインストールですから、バージョンを元に戻しても、削除再構成 の手順が入り、
以前とは異なる配置(FileSystem 上)になっているのではないですか?。また、4.x 系は必ずひとつしか存在しない事を考えれば、Kenjinote さまのお書きになったレジストリから算出する方法が microsoft の推奨する方法なのだと思います。
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月12日 1:16
- 回答としてマーク kkfuku 2016年12月13日 10:04
-
kenjinote さま、Azulean さま、佐祐理 さま、ShiroYuki_Mot さま
返信いただきましてありがとうございます。
投稿内容がわかりづらい文章で申し訳ありません。
連名での返信で申し訳ありません。
>.NET 4.0/4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2 はすべて同じ v4.0.30319 を返しますよ。
ここはわかっていませんでした。情報いただきありがとうございます。
また佐祐理 さまに記載いただいた内容も、後々調べている中でたどり着き、もっとよく調べておけばよかったです。
開発環境: Visual Studio 2008 C++/cli
*この時点で.Net Framework 3.5までになると思います。。。
*またソリューション上で.Net Framework 2.0 を指定しておりました。
ShiroYuki_Mot さまに提示いただいたようにバージョンを確認しましたところ、
2.0.50727 となっており、ソリューションの指定どおり.Net Framework 2.0で動作していました。
*これは.Net Framework 4.0をインストールしていても、.Net Framework 4.6.1/4.6.2をインストールしても変わらず
>また、本題は起動速度であって読み込まれたバージョンはあまり関係ないのではと思います。
>.Netframework 4.x 系は上書きインストールですから、バージョンを元に戻しても、削除再構成 の手順が入り、
>以前とは異なる配置(FileSystem 上)になっているのではないですか?。
元問題の起動速度については、別途いただいた情報を元に調査していきます。
本フォーラムへの問合せは一旦これでクローズしたいと思います。
多くの情報、意見いただきましてありがとうございます。
また書き込むことがありましたら、よろしくお願いします。- 編集済み kkfuku 2016年12月13日 10:05