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

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

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

Re[8]: .NETのバージョンを取得するには?


(過去ログ 161 を表示中)

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

■93061 / inTopicNo.1)  .NETのバージョンを取得するには?
  
□投稿者/ コリアン (1回)-(2019/11/18(Mon) 11:58:26)

分類:[.NET 全般] 

プログラムをビルドする時に、4clientや4.5, 4.6などの.NETのバージョンを指定することができますが
プログラム上で実行してあるEXEファイルのバージョンを調べるにはどのようにしたら良いですか?

調べればすぐに分かるかと思ったのですが
意外と見つかりませんでした。

よろしくお願いいたします。

引用返信 編集キー/
■93066 / inTopicNo.2)  Re[1]: .NETのバージョンを取得するには?
□投稿者/ みい (109回)-(2019/11/18(Mon) 13:21:25)
No93061 (コリアン さん) に返信
> プログラムをビルドする時に、4clientや4.5, 4.6などの.NETのバージョンを指定することができますが
> プログラム上で実行してあるEXEファイルのバージョンを調べるにはどのようにしたら良いですか?
>
> 調べればすぐに分かるかと思ったのですが
> 意外と見つかりませんでした。
>
> よろしくお願いいたします。
>
知りたいのは「EXEファイルのバージョン」ではなく「EXEファイルのFrameworkのバージョン」でいいんですよね?
試してはいませんが、「実行ファイル Framework バージョン」でググったら下記が見つかりました。
https://qiita.com/taiba/items/38b024b9d4e56dc9d323
https://www.out48.com/archives/2204/

引用返信 編集キー/
■93067 / inTopicNo.3)  Re[1]: .NETのバージョンを取得するには?
□投稿者/ 魔界の仮面弁士 (2488回)-(2019/11/18(Mon) 13:28:34)
No93061 (コリアン さん) に返信
> プログラム上で実行してあるEXEファイルのバージョンを調べるにはどのようにしたら良いですか?

ターゲット フレームワークのバージョンなら、アプリケーション構成ファイル (EXEファイル名.config) の
supportedRuntime 要素を参照してみてください。

AssemblyFileVersion 属性や AssemblyProduct 属性で示されるバージョンの事なら、こんな感じ。
https://dobon.net/vb/dotnet/file/myversioninfo.html
引用返信 編集キー/
■93068 / inTopicNo.4)  Re[2]: .NETのバージョンを取得するには?
□投稿者/ コリアン (3回)-(2019/11/18(Mon) 13:49:04)

ターゲット フレームワークのバージョンのことです。

configファイルを参照するとなると
テキストファイルとして開いて、

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>


を検索して調べるしかないですか?

configファイルが無くEXEファイルしかない場合にはどのようにすれば良いですか?

引用返信 編集キー/
■93070 / inTopicNo.5)  Re[3]: .NETのバージョンを取得するには?
□投稿者/ kaina (59回)-(2019/11/18(Mon) 14:17:09)
No93068 (コリアン さん) に返信
> configファイルが無くEXEファイルしかない場合にはどのようにすれば良いですか?

みいさんが貼ってくれたURLに書いてありますよ。

試してませんが、他にはこれとか。

https://devlights.hatenablog.com/entry/20120313/p1
引用返信 編集キー/
■93072 / inTopicNo.6)  Re[3]: .NETのバージョンを取得するには?
□投稿者/ 魔界の仮面弁士 (2489回)-(2019/11/18(Mon) 15:34:24)
No93068 (コリアン さん) に返信
> configファイルを参照するとなると
> テキストファイルとして開いて、

テキストファイルというか、XML ファイルとして読み込んだ方が楽でしょう。
また、 <supportedRuntime> は、優先順位順に複数記録されている可能性があります。
https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/startup/supportedruntime-element?WT.mc_id=DT-MVP-8907


なお、本来配布されるべき .config が無い場合、開発者が想定していた
ターゲットフレームワークとは異なるバージョンで動作する可能性があります。


> configファイルが無くEXEファイルしかない場合にはどのようにすれば良いですか?

アプリが実行される .NET Framework のバージョンは、次の順序で決まります。
https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-configure-an-app-to-support-net-framework-4-or-4-5?WT.mc_id=DT-MVP-8907

コンパイル時の CLR バージョンについては、System.Reflection.Assembly の
ImageRuntimeVersion で得られますが、これは .NET Framework のバージョンではないことに注意してください。
https://docs.microsoft.com/ja-jp/dotnet/api/system.reflection.assembly.imageruntimeversion?WT.mc_id=DT-MVP-8907&view=netframework-4.8


たとえば、.NET Framework 4.8 がインストールされている開発環境で、
.NET Framework 3.5 をターゲットとしてビルドした上で、
下記の .Config を用意していたとします。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>


この EXE を .NET Framework 4.5 以降がインストールされている環境で実行した場合、たとえば
 Assembly.ImageRuntimeVersion → "v2.0.50727"
 Environment.Version → "4.0.30319.42000"
というバージョン番号を返します。


しかしこの EXE を「.config 無し」で実行した場合、たとえ 4.5 以降がインストールされていたとしても、
2.0〜3.5 が無ければ実行できません。(.NET Framework 3.5 のインストールが要求されることもある)


実行できる環境の場合、ImageRuntimeVersion は .config の有無によらず同じ値を返しますが、
Environment.Version の方は、同じ EXE であっても、実行環境ごとに異なるバージョン番号が
返される可能性があります。たとえばこのように。

Environment.Version → "2.0.50727.8806"
Environment.Version → "2.0.50727.9148"
引用返信 編集キー/
■93079 / inTopicNo.7)  Re[1]: .NETのバージョンを取得するには?
□投稿者/ KOZ (42回)-(2019/11/19(Tue) 10:09:30)
No93061 (コリアン さん) に返信
> プログラムをビルドする時に、4clientや4.5, 4.6などの.NETのバージョンを指定することができますが
> プログラム上で実行してあるEXEファイルのバージョンを調べるにはどのようにしたら良いですか?

これでしょうか?
using System;
using System.Reflection;
using System.Runtime.Versioning;
using System.Diagnostics;

static class Program
{
    [STAThread]
    static void Main() {
        var asm = Assembly.GetExecutingAssembly();
        foreach (var attr in CustomAttributeData.GetCustomAttributes( asm)) {
            if (attr.AttributeType == typeof(TargetFrameworkAttribute)) {
                Debug.Print($"{attr.NamedArguments[0].TypedValue.Value}");
            }
        }
    }
}

結果:
.NET Framework 4.8


引用返信 編集キー/
■93080 / inTopicNo.8)  Re[2]: .NETのバージョンを取得するには?
□投稿者/ KOZ (43回)-(2019/11/19(Tue) 11:37:36)
結局 Reflection の嵐になってしまいました。
2.0 と 3.5 は情報が埋め込まれてないようです。

using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;

static class Program
{
    [STAThread]
    static void Main() {
        var asmHelper = new ReflectionHelper(Assembly.GetExecutingAssembly());
        var attributes = asmHelper.Invoke("GetCustomAttributesData");
        if (attributes == null) {
            Debug.Print(".NET Framework 2.0/3.5");
        } else {
            foreach (var attr in (IEnumerable)attributes) {
                var attrHelper = new ReflectionHelper(attr);
                var attributeType = new ReflectionHelper(attrHelper.GetProperty("AttributeType"));
                var fullName = (string)attributeType.GetProperty("FullName");
                if (fullName == "System.Runtime.Versioning.TargetFrameworkAttribute") {
                    var namedArguments = new ReflectionHelper(attrHelper.GetProperty("NamedArguments"));
                    var item = new ReflectionHelper(namedArguments.GetProperty("Item", 0));
                    var typedValue = new ReflectionHelper(item.GetProperty("TypedValue"));
                    Debug.Print((string)typedValue.GetProperty("Value"));
                }
            }
        }
    }

    private class ReflectionHelper
    {
        private object Target;
        private Type TargetType;

        public ReflectionHelper(object target) {
            Target = target;
            TargetType = target.GetType();
        }

        public object GetProperty(string propertyName, params object[] parameters) {
            var pi = TargetType.GetProperty(propertyName);
            if (pi != null) {
                return pi.GetValue(Target, parameters);
            }
            return null;
        }

        public object Invoke(string methodName, params object[] parameters) {
            var mi = TargetType.GetMethod(methodName);
            if (mi != null) {
                return mi.Invoke(Target, parameters);
            }
            return null;
        }
    }
}

引用返信 編集キー/
■93167 / inTopicNo.9)  Re[3]: .NETのバージョンを取得するには?
□投稿者/ コリアン (4回)-(2019/11/25(Mon) 19:28:18)
KOZさん

ご回答ありがとうございます。

VB.NETを使っているのですが、
VBで書くのならどのようにすれば良いですか?

引用返信 編集キー/
■93168 / inTopicNo.10)  Re[4]: .NETのバージョンを取得するには?
□投稿者/ コリアン (5回)-(2019/11/25(Mon) 19:46:26)
2019/11/25(Mon) 19:47:38 編集(投稿者)

For Each attr As CustomAttributeData In CustomAttributeData.GetCustomAttributes(Assembly.GetExecutingAssembly())

If attr.AttributeType Is GetType(Runtime.Versioning.TargetFrameworkAttribute) Then

aaa = attr.NamedArguments(0).TypedValue.Value.ToString

End If

Next attr


これでできました
どうもありがとうございました。

解決済み
引用返信 編集キー/
■93170 / inTopicNo.11)  Re[5]: .NETのバージョンを取得するには?
□投稿者/ コリアン (6回)-(2019/11/25(Mon) 19:55:50)
すいません、Framework4.6だとうまくいったのですが、

4でやると
attr.AttributeType

のところで
エラー BC30456 'AttributeType' は 'CustomAttributeData' のメンバーではありません。

というエラーが出ます
どうすれば良いですか?


引用返信 編集キー/
■93171 / inTopicNo.12)  Re[6]: .NETのバージョンを取得するには?
□投稿者/ コリアン (8回)-(2019/11/25(Mon) 20:08:55)
重ね重ねすいません。

下に書いてくださった
private class ReflectionHelper
を使う方法で
バージョン4でもうまくいきました。

一つ目の方法の方がシンプルで良いですが
バージョン4では使えないのでしょうか?

引用返信 編集キー/
■93178 / inTopicNo.13)  Re[7]: .NETのバージョンを取得するには?
□投稿者/ KOZ (51回)-(2019/11/26(Tue) 08:52:55)
2019/11/26(Tue) 08:59:12 編集(投稿者)

No93171 (コリアン さん) に返信
> 一つ目の方法の方がシンプルで良いですが
> バージョン4では使えないのでしょうか?

えーっと、使えないのを目の当たりにされたのでは?

Telerik の JustDecompile というデコンパイルできるソフトで、同様のことができるうえ.NET 1.0 と .NET 2.0/3.5 の区別がつきます。

JustDecompile そのものが .NET で出来ているので、JustDecompile を JustDecompile でデコンパイルしてソースを追えば、もっとスマートな方法があるかもしれません。

Telerik JustDecompile
https://www.telerik.com/products/decompiler.aspx
引用返信 編集キー/
■93203 / inTopicNo.14)  Re[8]: .NETのバージョンを取得するには?
□投稿者/ コリアン (9回)-(2019/11/27(Wed) 22:34:07)
なるほど、どうもありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -