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

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

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

Re[7]: ビルド日時をEXEファイルに書き込む方法


(過去ログ 138 を表示中)

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

■81279 / inTopicNo.1)  ビルド日時をEXEファイルに書き込む方法
  
□投稿者/ 倍子 (1回)-(2016/09/06(Tue) 11:00:13)

分類:[.NET 全般] 


VBです。
ビルド時にNow関数で現在日時を取得し
EXEファイルに書き込み、
EXEファイルを実行した時にビルド日時を表示できるようにしたいのですが
どうすれば良いですか?

ビルド日時 取得
で検索して調べると
ファイルの更新日時を取得して表示する
というものしか見つかりませんでした。
EXEファイルにビルド時に日時を書き込む方法を教えてください。





引用返信 編集キー/
■81280 / inTopicNo.2)  Re[1]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ WebSurfer (1025回)-(2016/09/06(Tue) 11:31:57)
No81279 (倍子 さん) に返信

> ビルド日時 取得
> で検索して調べると

自分も同じキーワードで検索してみました。

以下の記事がヒットしましたが、これではダメということなら、その理由
を教えてください

アセンブリ(exe,dll)に埋め込まれているビルド日時のタイムスタンプを取得してみる
http://sumikko8note.blog.fc2.com/blog-entry-30.html

引用返信 編集キー/
■81281 / inTopicNo.3)  Re[1]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 魔界の仮面弁士 (882回)-(2016/09/06(Tue) 11:45:43)
No81279 (倍子 さん) に返信
> EXEファイルを実行した時にビルド日時を表示できるようにしたいのですが
> どうすれば良いですか?

(1) プロジェクト エクスプローラーでプロジェクトを右クリックし、
  新しい項目として[全般]-[テキスト ファイル]から
  TextFile1.txt を追加する。


(2) 空のテキストファイルが追加されるので、
  プロジェクト エクスプローラーでそれを選択し、プロパティから
   ビルドアクション:埋め込まれたリソース
  に変更する。


(3) Form1 に下記のコードを追加。

Imports System.IO
Imports System.Reflection

Public Class Form1
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim resName As String = My.Application.Info.AssemblyName & ".TextFile1.txt"
    Dim asm As Assembly = Assembly.GetExecutingAssembly()
    Dim txt As String = ""
    Using sr As New StreamReader(asm.GetManifestResourceStream(resName))
      txt = sr.ReadToEnd()
    End Using
    MsgBox(txt)
  End Sub
End Class


(4) プロジェクト プロパティの[コンパイル]-[ビルド イベント]の
「ビルド前イベント」に、以下のコマンドを追加。

ECHO %DATE% %TIME% > "$(SolutionDir)TextFile1.txt"
引用返信 編集キー/
■81282 / inTopicNo.4)  Re[2]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (3回)-(2016/09/06(Tue) 12:12:39)
ありがとうございます。
VB2010Expressだと、[ビルド イベント]や「ビルド前イベント」という項目が存在しないのですが。
[コンパイル]という項目はあるのですが
ビルド前イベントという設定は見当たりません。
どうすればよいですか?
引用返信 編集キー/
■81283 / inTopicNo.5)  Re[3]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 774RR (451回)-(2016/09/06(Tue) 13:03:26)
https://msdn.microsoft.com/ja-jp/library/7xctbe2f.aspx
Express にはビルドイベントが無いそうな。
Community ならあるのかな?

引用返信 編集キー/
■81284 / inTopicNo.6)  Re[3]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 魔界の仮面弁士 (883回)-(2016/09/06(Tue) 13:04:45)
No81282 (倍子 さん) に返信
> VB2010Expressだと、[ビルド イベント]や「ビルド前イベント」という項目が存在しないのですが。

Express なのであれば、ビルドイベントは使えないですね。
.vbproj ファイルを直接編集して、
<PropertyGroup><PreBuildEvent>ECHO %25DATE%25 %25TIME%25 &gt; "$(SolutionDir)TextFile1.txt"</PreBuildEvent></PropertyGroup>
を加えれば動作するかもしれませんが…。


> どうすればよいですか?
No81280 の方法を試してみては如何でしょう。


'【VB2005 以降向け】
Imports System.Runtime.InteropServices
Imports System.Reflection
Imports System.IO
Module Module1
  Public Function GetBuildDateTime() As Nullable(Of Date)
    Dim filePath As String = Assembly.GetExecutingAssembly().Location
    Return GetBuildDateTime(filePath)
  End Function
  Public Function GetBuildDateTime(ByVal filePath As String) As Nullable(Of Date)
    Const MZ As Short = &H5A4DS
    Const PE As Integer = &H4550I
    Try
      Using r As New BinaryReader(File.OpenRead(filePath))
        'IMAGE_DOS_HEADER
        Dim dos = r.ReadBytes(64)
        If dos.Length < 64 Then Return Nothing
        If BitConverter.ToInt16(dos, 0) <> MZ Then Return Nothing
        Dim e_lfanew As Integer = BitConverter.ToInt32(dos, 60)

        'IMAGE_NT_HEADER (IMAGE_FILE_HEADERまで)
        r.BaseStream.Seek(e_lfanew, SeekOrigin.Begin)
        Dim nt = r.ReadBytes(24)
        If nt.Length < 24 Then Return Nothing
        If BitConverter.ToInt32(nt, 0) <> PE Then Return Nothing
        Dim timeDateStamp As Integer = Marshal.ReadInt32(nt, 8)
        Return New Date(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(timeDateStamp).ToLocalTime()
      End Using
    Catch
      Return Nothing
    End Try
  End Function
End Module



'【.NET Framework 4.6 以上向け(VB2012以降)】
Imports System.Runtime.InteropServices
Imports System.Reflection
Imports System.IO
Module Module1
  Public Function GetBuildDateTime() As Date?
    Dim filePath As String = Assembly.GetExecutingAssembly().Location
    Return GetBuildDateTime(filePath)
  End Function
  Public Function GetBuildDateTime(ByVal filePath As String) As Date?
    Const MZ As Short = &H5A4DS
    Const PE As Integer = &H4550I
    Try
      Using r As New BinaryReader(File.OpenRead(filePath))
        'IMAGE_DOS_HEADER
        Dim dos = r.ReadBytes(64)
        If dos.Length < 64 Then Return Nothing
        If BitConverter.ToInt16(dos, 0) <> MZ Then Return Nothing
        Dim e_lfanew As Integer = BitConverter.ToInt32(dos, 60)

        'IMAGE_NT_HEADER (IMAGE_FILE_HEADERまで)
        r.BaseStream.Seek(e_lfanew, SeekOrigin.Begin)
        Dim nt = r.ReadBytes(24)
        If nt.Length < 24 Then Return Nothing
        If BitConverter.ToInt32(nt, 0) <> PE Then Return Nothing
        Dim timeDateStamp As Integer = Marshal.ReadInt32(nt, 8)
        Return DateTimeOffset.FromUnixTimeSeconds(timeDateStamp).ToLocalTime().DateTime
      End Using
    Catch
      Return Nothing
    End Try
  End Function
End Module
引用返信 編集キー/
■81285 / inTopicNo.7)  Re[4]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (4回)-(2016/09/06(Tue) 13:19:14)
WebSurferさんの方法は後で試してみます。

.vbproj ファイルを直接編集する方法で
ビルド日時をtxtファイルに出力するところはうまくいきました。
しかし、


Using sr As New StreamReader(asm.GetManifestResourceStream(resName))

というところで
値を Null にすることはできません。
パラメーター名:stream

というエラーが出てしまいます。
何が原因でしょうか?



引用返信 編集キー/
■81286 / inTopicNo.8)  Re[5]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 魔界の仮面弁士 (884回)-(2016/09/06(Tue) 13:25:33)
No81285 (倍子 さん) に返信
> Using sr As New StreamReader(asm.GetManifestResourceStream(resName))
> 値を Null にすることはできません。

resName が正しい名前になっていない場合、
GetManifestResourceStream メソッドは Nothing を返します。

そのアプリで利用可能なリソースの一覧は、
asm.GetManifestResourceNames() で得られますので、
その中に、resName で指定したのと同じ文字列があるかどうか
確認してみてください。
引用返信 編集キー/
■81287 / inTopicNo.9)  Re[5]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ まく (7回)-(2016/09/06(Tue) 13:25:57)
ちなみに、
モジュールやクラスファイルなどはslnファイルと同じフォルダー内のslnフォルダー内に全て入っています。
そのため
<PreBuildEvent>ECHO %25DATE%25 %25TIME%25 &gt; "$(SolutionDir)sln\TextFile1.txt"</PreBuildEvent>

とした上で、

Dim resName As String = My.Application.Info.AssemblyName & ".sln\TextFile1.txt"

としてみましたがうまくいきませんでした。
何が原因でしょうか?

引用返信 編集キー/
■81288 / inTopicNo.10)  Re[6]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (5回)-(2016/09/06(Tue) 13:28:18)
ちなみに、
モジュールやクラスファイルなどはslnファイルと同じフォルダー内のslnフォルダー内に全て入っています。
そのため
<PreBuildEvent>ECHO %25DATE%25 %25TIME%25 &gt; "$(SolutionDir)sln\TextFile1.txt"</PreBuildEvent>

とした上で、

Dim resName As String = My.Application.Info.AssemblyName & ".sln\TextFile1.txt"

としてみましたがうまくいきませんでした。
何が原因でしょうか?
引用返信 編集キー/
■81289 / inTopicNo.11)  Re[7]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (7回)-(2016/09/06(Tue) 13:36:57)
アセンブリ名とルート名が違うのが原因でした

Dim resName As String = GetType(Form1).Namespace() & ".TextFile1.txt"

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

解決済み
引用返信 編集キー/
■81290 / inTopicNo.12)  Re[6]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 魔界の仮面弁士 (885回)-(2016/09/06(Tue) 13:37:42)
No81287 (まく さん) に返信
> Dim resName As String = My.Application.Info.AssemblyName & ".sln\TextFile1.txt"
> としてみましたがうまくいきませんでした。

.sln は使わないです。


プロジェクトのプロパティの [アプリケーション]タブで、
「アセンブリ名」「ルート名前空間」があると思いますが、
この二つが同じ名前になっているかを確認してみてください。

My.Application.Info.AssemblyName が返すのは「アセンブリ名」の方ですが、
GetManifestResourceStream が要求するのは「ルート名前空間」です。


正しくルート名前空間を取得するために、
  Dim ns As String = My.Application.GetType().Namespace
  ns = ns.Substring(0, ns.Length - 3)
  Dim resName As String = ns & ".TextFile1.txt"
に変更して見てください。
引用返信 編集キー/
■81291 / inTopicNo.13)  Re[8]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (8回)-(2016/09/06(Tue) 13:51:09)
すいません。ビルド日時を取得することには成功しました。
しかし、ビルドするたびに、

このファイルはソースエディター以外で変更されました。
再度読み込みますか?

というメッセージが表示されてしまいます。
これが表示されないようにできる方法があれば教えてください。

引用返信 編集キー/
■81292 / inTopicNo.14)  Re[9]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 魔界の仮面弁士 (886回)-(2016/09/06(Tue) 14:03:57)
No81291 (倍子 さん) に返信
> これが表示されないようにできる方法があれば教えてください。

TextFile1.txt を表示したままビルドしていると、更新メッセージが表示されます。
TextFile1.txt を閉じてからビルドして見てください。
引用返信 編集キー/
■81293 / inTopicNo.15)  Re[1]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ PANG2 (149回)-(2016/09/06(Tue) 14:11:25)
No81279 (倍子 さん) に返信
> EXEファイルにビルド時に日時を書き込む方法を教えてください。

外部ファイルだと、簡単に改竄できるので EXEファイル自身に持つのがよいかと。

sumikko8note さんが3つの方法を紹介しています。
一番目がお勧め。
http://sumikko8note.blog.fc2.com/blog-entry-25.html
引用返信 編集キー/
■81294 / inTopicNo.16)  Re[2]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (9回)-(2016/09/06(Tue) 14:52:20)
魔界の仮面弁士さん
ありがとうございます。
うまくいきました。

PANG2さん

AssemblyVersionを使った方法も試してみたいのですが
AssemblyInfo.vb
内で
[assembly: AssemblyVersion("1.0.*")]
に書き換えても、バージョン名が
”1.0.5345.35759″のような形式にはならず
1.0.0.0という形式なのですが何が原因でしょうか?
 

引用返信 編集キー/
■81295 / inTopicNo.17)  Re[3]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (10回)-(2016/09/06(Tue) 15:10:21)
win7ですが、右クリックメニューに
ファイルバージョンと製品バージョンがあり
製品バージョンがAssemblyVersionだと思っていたのですが
どうも違っていて、右クリックメニューにはAssemblyVersionが表示されていないことが分かりました。

Dim asm = System.Reflection.Assembly.GetExecutingAssembly()
Dim Version As Version = asm.GetName().Version

Dim days = Int(Version.Build)
Dim seconds = Int(Version.Revision * 2)

Dim baseDate As DateTime = New DateTime(2000, 1, 1)
Dim buildDate As DateTime = baseDate.AddDays(days)
Dim buildDateTime As DateTime = buildDate.AddSeconds(seconds)

Dim sb As StringBuilder = New StringBuilder()
sb.Append("アセンブリバージョン:")
sb.AppendLine(Version.ToString())
sb.Append("ビルド日時:")
sb.AppendLine(buildDateTime.ToString("yyyy'/'MM'/'dd' 'HH':'mm':'ss"))
MessageBox.Show(sb.ToString())



で、バージョン名からビルド日時を取得することができました。
しかし、ビルドし直してもバージョン名が書き換わらないのですが。
AssemblyInfo.vbを一度書き換えてから、再度元に戻してビルドするとバージョン名が書き換わります。
もっと簡単に自動的にビルドごとにバージョン名を書き換える方法はないのでしょうか?



引用返信 編集キー/
■81296 / inTopicNo.18)  Re[4]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 774RR (452回)-(2016/09/06(Tue) 16:09:32)
AssemblyVersion は安易に変更するものではないので、ビルド日付を埋める程度の目的に使うのは NG
CLR 的には AssemblyVersion が違うものはバイナリ非互換とみなされるわけっす。
AssemblyVersion が違う DLL 類を提供されると、使う側は全部再コンパイルする必要があるです。

AssemblyVersion は user.config にも関与するので、設定機能を持つアプリにおいて
ある AssermblyVersion のものに対してユーザが設定した内容は
異なる AssemblyVersion のものには適用されないってことになる。
プログラム側に設定値の移行コードが必要なくらい「違うもの」扱いになっている。

ビルド日付を入れる程度のものには AssemblyFileVersion を使おう。
エクスプローラが表示するバージョンもこっち。

あと AssemblyInformationVersion なんてのもあるけど説明略。

引用返信 編集キー/
■81297 / inTopicNo.19)  Re[5]: ビルド日時をEXEファイルに書き込む方法
□投稿者/ 倍子 (11回)-(2016/09/06(Tue) 16:13:20)

AssemblyFileVersionでも試してみたのですが

<Assembly: AssemblyFileVersion("1.0.*")>

とやっても
1.0.*がそのまま表示されるだけで、
ビルド日時の情報が含まれないのですが。
アスタリスクを使えるのは
AssemblyVersionだけではないのでしょうか?
 
引用返信 編集キー/
■81301 / inTopicNo.20)  Re[6]: ビルド日時をEXEファイルに書き込む方法
 
□投稿者/ Azulean (703回)-(2016/09/06(Tue) 22:07:18)
2016/09/06(Tue) 22:09:30 編集(投稿者)

No81297 (倍子 さん) に返信
> アスタリスクを使えるのは
> AssemblyVersionだけではないのでしょうか?

そうです。
なお、AssemblyVersion だけを指定して、AssemblyFileVersion を消すと、AssemblyVersion がファイルバージョンになりますけどね。

アセンブリバージョンを安易に変えるのはダメというのは、ライブラリとしてリリースするとか、ソリューション分けていて結合する必要があるとかだと効いてくる話なので、
単一 exe で自分だけで開発していますということなら、実害はないかと。


// 気合い入れてやるなら、リリースビルドの仕組みを MSBuild を使って実現するようなものを作って、AssemblyInfo を自動生成するとかかなぁ。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -