質問

アセンブリの最終変更日を(内部デバッグ/情報用に)表示したいので、特定のWebサイトがいつデプロイされたかがわかります。

リフレクションを介して取得することは可能ですか?

次のようなバージョンを取得します:

Assembly.GetExecutingAssembly().GetName().Version.ToString();

似たようなものを探しています-マスターページでレンダリングするため、物理ファイルを開いたり、そのプロパティなどを取得したりしたくありません。オーバーヘッドの種類。

役に立ちましたか?

解決

2番目のpYraniaの答え:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;

ただし、これを追加:

ファイルシステムはマスターページにあるので、ファイルシステムにアクセスしたくないと言いますが、すべてのページでその余分なファイルシステムをヒットさせたくありません。そのため、アプリケーションのロードイベントで一度アクセスしてから、アプリケーションレベルの変数として保存してください。

他のヒント

AssemblyInfoのリビジョン番号とビルド番号をデフォルトにする場合:

[assembly: AssemblyVersion("1.0.*")]

おおよそのビルド日は、次の方法で取得できます。

Version version = typeof(MyType).Assembly.GetName().Version;
DateTime date = new DateTime(2000, 1, 1)
    .AddDays(version.Build)
    .AddSeconds(version.Revision * 2);

これはどうですか?

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;

アセンブリにはビルドの日付がないと思う人もいますが、何が間違っているのか知っています。 次のように、実行可能ファイルに埋め込まれた PEヘッダーからリンカーのタイムスタンプを取得できます。動作します(自分でコードをテストしていません)

private DateTime RetrieveLinkerTimestamp()
{
    string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
    const int c_PeHeaderOffset = 60;
    const int c_LinkerTimestampOffset = 8;
    byte[] b = new byte[2048];
    System.IO.Stream s = null;

    try
    {
        s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        s.Read(b, 0, 2048);
    }
    finally
    {
        if (s != null)
        {
            s.Close();
        }
    }

    int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
    int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
    dt = dt.AddSeconds(secondsSince1970);
    dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
    return dt;
}

またはアセンブリが独自のものである場合は、次のアプローチをシンプルかつ簡単に使用します

ビルド前のイベントコマンドラインに以下を追加:

echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"

このファイルをリソースとして追加すると、リソースに「BuildDate」文字列が追加されます。

この質問

から両方の回答を得ました

1970 int32 を使用しているため、 RetrieveLinkerTimestamp ソリューションは 2038 年以降は機能しません。以下を使用することをお勧めします(ただし、これにはおそらく制限もあります):

IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)

アセンブリは、オペレーティングシステムの属性であるため、最後に変更された情報を保持するとは思わない。この情報を取得する唯一の方法は、ファイルハンドルを使用することです。

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