2013-04-05 5 views
6

App.MajorApp.MinorApp.Revisionなどを使用して、vb6でexe(独自のバージョン)のファイルバージョンを取得できます。しかし、どのようにvb.netで同じようにすることができます。私は次の3つの方法を試してみました。すべての3例でファイルのバージョンを取得する

Text1.Text = My.Application.Info.Version.Major & "." & My.Application.Info.Version.Minor & "." & My.Application.Info.Version.Build & "." & My.Application.Info.Version.Revision 

Text2.Text = Me.GetType.Assembly.GetName.Version.ToString() 

Text3.Text = My.Application.Info.Version.ToString() 

それは、アセンブリバージョンを返していました(exeファイルをXP machine.Inウィンドウで8を作成したところ、私はbinフォルダにそれを確認し、私は、ファイルのプロパティを見ると、私はアセンブリバージョンのような任意のオプションを参照してくださいdidntの)

デフォルトでは、アセンブリとファイルのバージョンは同じですが、私は手動で変更しましたproject properties->applicationassembly information->File version私は自分のコードがアセンブリバージョンを返すことを知りました。 どうすればファイルのバージョンを取得できますか?アセンブリとファイル交換とは何ですか?

答えて

2

は使用FileVersionInfo.GetVersionInfo、例えば:

Dim myFileVersionInfo As FileVersionInfo = 
    FileVersionInfo.GetVersionInfo([Assembly].GetExecutingAssembly().Location) 
+0

私はそのコードを試してみるとエラーが表示されます。 'アセンブリ'は 'Reflection'の型であり、式として使用することはできません。 :(このコードは動作しません。ソースコードの "[Assembly]"を何か別のものに置き換えようとしましたか? –

+0

私はそれを動作させました。答え! –

1

アプリケーションのバージョンを取得する最も簡単な方法はこれです:

My.Application.Info.Version.Major 
    My.Application.Info.Version.MajorRevision 

などのアセンブリの説明については、この記事で

ルック: http://visualbasic.about.com/od/FWTools/a/FWAssemblies.htm qucik infoとして:アセンブリには複数のファイルが含まれる可能性があるため、イオンはファイル情報よりも優れています。

+0

が間違っていますアセンブリバージョンと(アセンブリ)ファイルバージョンの間に大きな違いがあります –

+0

DLLからMy.Application.Info.Versionを実行すると、EXEの情報が取得されます。 DLL自体、Shawnのコードが必要です... FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly()。Location).FileVersion – Rose

+0

My.Applicationオブジェクトが存在しないため、これもクラスライブラリでは機能しません。 –

3

.NETプログラムでは、実際には2つのバージョンがあります(そのうちの1つではありません)。アセンブリバージョンはあなたが掴んでいるもので、.NETで取得するのが簡単です。これは本質的に ".NETのバージョン"なので、アセンブリには異なるバージョンがある場合は、それが使います。

「ファイルバージョン」がある、またはMicrosoftが混乱をさらに悪化させるために「アセンブリファイルバージョン」と呼んでいるのを見ている場所があります。だから実際に名前に "ファイル"が含まれているかどうかを確認する必要があります。アセンブリのこの「ファイル」バージョンはファイルシステムに関連付けられているため、Windowsエクスプローラでそのバージョンを見ると、これが表示されます。

なぜマイクロソフトはそれらを2つの異なるものに分割し、それらを結びつけなかったのか、私は理解しません。多分誰かが私をさらに啓発することができます。

私はFileVersionを取得するコードを見つけました。私はVBでもC#でもそれを取得する方法を探していたので、私はこの質問を見つけました。 C#では、アセンブリへのアクセスを含め、ほとんどの作業がより簡単になると思います。だからここにあなたのプログラムのファイルバージョンを取得するために、VBのコードです:

Dim fileName$ = System.Reflection.Assembly.GetExecutingAssembly().Location 
Dim fileName2$ = Application.ExecutablePath ' this grabs the filename too, 
' but #2 ends with ".EXE" while the 1st ends with ".exe" in my Windows 7. 

' either fileName or fileName2 works for me. 
Dim fvi As FileVersionInfo = FileVersionInfo.GetVersionInfo(fileName) 
' now this fvi has all the properties for the FileVersion information. 
Dim fvAsString$ = fvi.FileVersion ' but other useful properties exist too. 

うわー、それはVB6であったような単純なものでなければなりません何かのコードがたくさん。たぶんApp.Version.ToStringか何か。ワオ。行く方法、マイクロソフト!少なくともこの1つは、あなた自身の音楽ストリングを演奏するのと同じように、スタントの一部と同じくらい難しいものではありません。

+0

この「ファイルバージョン」はファイルシステムの一部ではなく、ファイルフォーマットの一部ですWindowsエクスプローラはファイルを開きます。広告はファイルシステムからではなく、ファイルの内容からバージョンを読み取ります。 – Zrin

+0

@Zrin、あなたの訂正に感謝します。あなたが自分の訂正を確認して、これが本当に事実であるかどうかを知ることができますか? –

+0

"exeファイルのバージョン情報"を検索する - EXE( "PE")ファイルにはバージョン情報フィールドがあり、 "versioninfo"ブロックを含むこともできます。 :NETアセンブリには、独自の埋め込みバージョン情報とはるかに多くのメタ情報があります。 "管理されたコード" ...ファイルシステムの機能であれば、最も単純なテキストファイルであっても、任意のファイルのバージョン情報を設定することができます。 – Zrin

2

実際Shawns回答を取って、あなたは、コード

Dim FileVer As String = FileVersionInfo.GetVersionInfo(Application.ExecutablePath).FileVersion 

の1行でファイルのバージョンを取得することができたり、ラベルに行くに

Me.Label1.Text = FileVersionInfo.GetVersionInfo(Application.ExecutablePath).FileVersion 

方法でそれを置くことができ、それを少し改善します!いつものような単純なVB.NET ....

0

次は、アセンブリ自体の中から、アセンブリのファイルバージョン情報を取得するための、より信頼性の高い方法である:

Function GetAssemblyFileVersion() As String 
    Dim ProjectAssembly As Reflection.Assembly 
    ProjectAssembly = Reflection.Assembly.GetExecutingAssembly() 

    For Each attr As Attribute In ProjectAssembly.GetCustomAttributes(False) 
     If TypeOf attr Is Reflection.AssemblyFileVersionAttribute Then 
      Dim FileVerAttr As Reflection.AssemblyFileVersionAttribute = attr 
      Return FileVerAttr.Version 
     End If 
    Next 

    Throw New Reflection.TargetInvocationException(
     New KeyNotFoundException(
      "Cannot find custom attribute 'AssemblyFileVersionAttribute'")) 
End Function 
0

これは私が作成した拡張メソッドでありますAssemblyFileVersionを返します。 このメソッドは、アプリケーションとクラスライブラリで機能します。

''' <summary> 
''' Gets the AssemblyFileVersion from the specified assembly. 
''' </summary> 
''' <param name="Assembly">[Assembly] Assembly to get the Assembly File Version from.</param> 
''' <returns>[String] The Assembly's file version.</returns> 
<Extension> 
Friend Function GetFileVersion(ByVal Assembly As Assembly) As String 
    On Error GoTo Err 
    Return DirectCast(Assembly.GetCustomAttribute(GetType(AssemblyFileVersionAttribute)), AssemblyFileVersionAttribute).Version 
Err: 
    Return Nothing 
End Function 

は、覚えておいてくださいExtension MethodsModuleに配置する必要性を、彼らはClassで作成することができません。 Extension Methodsの詳細については、上記の検索バーに入力してください。彼らはあなたの人生を楽にします。 ;)

Imports System.Runtime.CompilerServices 

今すぐ任意のアセンブリにあなたは、単にこのような何かを呼び出すことができます...あなたのモジュールに次のものが含まれていることを確認します。

Dim Version as String = AnyAssembly.GetFileVersion() 
0

私は燃え尽きましたが、あなたはApplication.ProductVersionを試しましたか?私は他の質問でそれを見ない。これにより、x.x.x.xがどのバージョンのプロジェクト設定であっても返されます。 clickonceの場合は、他のサイトから取得する必要があります。

関連する問題