人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VisualStudio2010のVisualBasicで質問です。自己をビルドした日時をVB上から取得できる方法を教えて下さい。

ルール1.自分自身のファイルスタンプを取得して、ビルドした日時とするのは無しです。
ルール2.但しsigntool.exeを使用して埋めこまれた自己の証明書タイムスタンプを読み取って取得するのは有りです。
ルール3..NET FrameworkのAPIを使用するのは有りです。但しその際は必要なバージョンを教えて頂ければ助かります。

以上よろしくおねがいします。

●質問者: くじぇ
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● 勇者よっしー
●0ポイント

__TIME__
で一発で取れますよ
__DATE__
で、ファイル別のコンパイル時間も取れます


くじぇさんのコメント
Dim strDate As String = __DATE__ としたところ、「'__DATE__'は宣言されていません。アクセスできない保護レベルになっています。」と表示され、うまくいきません。 __DATE__ってC系のみのマクロでは無いですよね?

2 ● cx20
●300ポイント ベストアンサー

ベタな方法ですが、IMAGE_FILE_HEADER の TimeDateStamp 項目を参照することで、コンパイル時の時間が取得できるようです。

■ Coding Horror: Determining Build Date the hard way
http://www.codinghorror.com/blog/2005/04/determining-build-date-the-hard-way.html

' File : BuildDateTest.vb
Imports System.IO
Imports System.Reflection

Module Module1
 Sub Main()
 Dim strPath = Assembly.GetExecutingAssembly().Location
 Console.WriteLine(RetrieveLinkerTimestamp(strPath))
 End Sub

 Function RetrieveLinkerTimestamp(ByVal filePath As String) As DateTime
 Const PeHeaderOffset As Integer = 60
 Const LinkerTimestampOffset As Integer = 8

 Dim b(2047) As Byte
 Dim s As Stream
 Try
 s = New FileStream(filePath, FileMode.Open, FileAccess.Read)
 s.Read(b, 0, 2048)
 Finally
 If Not s Is Nothing Then s.Close()
 End Try

 Dim i As Integer = BitConverter.ToInt32(b, PeHeaderOffset)

 Dim SecondsSince1970 As Integer = BitConverter.ToInt32(b, i + LinkerTimestampOffset)
 Dim dt As New DateTime(1970, 1, 1, 0, 0, 0)
 dt = dt.AddSeconds(SecondsSince1970)
 dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours)
 Return dt
 End Function
End Module

<参考情報>
■ EXEファイルの内部構造(PEヘッダ)(1/3):CodeZine
http://codezine.jp/article/detail/412
■ VBScript で PE ヘッダを読み込む方法 - CX's VBScript Diary - VBScript グループ
http://vbscript.g.hatena.ne.jp/cx20/20090813/1250152142


くじぇさんのコメント
cx20さんありがとうございます。 試してみたところうまく行きました。助かりました。 余談ですが、「If Not s Is Nothing Then s.Close()」について 手持ちの環境では「変数's'は、値が割り当てられる前に使用されています。Null参照の例外が実行時に発生する可能性があります。」と注意されました。 そこで、Dim s As Stream = Nothing として使用しようと考えています。

cx20さんのコメント
警告見落としてました。ご指摘ありがとうございます。 (コピペしてビルドが通ったので、ちゃんと確認してませんでした(汗)) 「Nothing で初期化」で良いと思います。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ