12

AssemblyInfo.csファイルからバージョン番号を抽出しようとしています!そして、私は使用しようとしてSystem.Reflection.Assembly.LoadFile(path);いますが、これを実行している間、BadImageFormatExceptionが発生します。「モジュールにはアセンブリマニフェストが含まれている必要がありました。(HRESULTからの例外:0x80131018)」。だから今私は負傷しました、それはそれについて行くための可能な方法ではありませんか?代わりにRegExを使用する必要がありますか?

で多くの例を読みましGetExecutingAssembly()たが、他のプロジェクトからバージョンを取得したいと思います。

明確化: AssemblyInfo.csファイルからバージョン情報を読みたいです!そして、コンパイルされたファイルからではありません。新しいリリースを作成する前に、バージョン番号を更新するツールを作成しようとしています。

4

6 に答える 6

9

次のようにロードせずにアセンブリバージョンを取得できます。

using System.Reflection;
using System.IO;

...

// Get assembly 
AssemblyName currentAssembly = AssemblyName.GetAssemblyName(path);
Version assemblyVersion = currentAssembly.Version;

編集:ファイルを読みたい場合は、次のように行うことができます:

string path = @"d:\AssemblyInfo.cs";
            if (File.Exists(path))
            {
                // Open the file to read from.
                string[] readText = File.ReadAllLines(path);
                var versionInfoLines = readText.Where(t => t.Contains("[assembly: AssemblyVersion"));
                foreach (string item in versionInfoLines)
                {
                    string version = item.Substring(item.IndexOf('(') + 2, item.LastIndexOf(')') - item.IndexOf('(') - 3);          
                    //Console.WriteLine(Regex.Replace(version, @"\P{S}", string.Empty));
                    Console.WriteLine(version);
                }

            }

//出力

1.0.*
1.0.0.0

この助けを願っています...

于 2012-05-08T12:15:16.673 に答える
6

AssemblyName.GetAssemblyNameでターゲットアセンブリパスを指定できます

AssemblyName.GetAssemblyName("ProjectB.exe").Version
于 2012-05-08T12:05:49.333 に答える
1

AssemblyInfo.csファイルはILアセンブリにコンパイルされます。

そのアセンブリをロードすると、すでに見たすべての例を含むバージョンを読み取ることができます。これは、コンパイルされたアセンブリファイルから埋め込みバージョン情報を読み取っています。コンパイルプロセスによって、現在のファイルとは異なる値に上書きされる可能性があります。AssemblyInfo.cs

AssemblyInfo.csただし、代わりに、コンパイルせずにテキストファイルからバージョン番号を読み取ることが必要なようです。

この場合、プロジェクトに適した形式の正規表現を使用するか、単純にするための規則を考え出す必要があります。

これは簡単かもしれません

var versionMatch = Regex.Match(File.ReadAllText(filename), @"AssemblyVersion\s*\(\s*""([0-9\.\*]*?)""\s*\)");
if (versionMatch.Success)
{
    Console.WriteLine(versionMatch.Groups[1].Value);
}

は、コンパイル時1.0.*にフォームのタイムスタンプ値に変換される有効なバージョン文字列であり、一部は厳密に推測できますが、正確には推測できないため、そこにあるものに関する規則を考慮する必要があります。1.0.nnn.mmmnnnmmm

于 2019-02-16T01:52:09.477 に答える
1

これは、AssemblyInfo.csクラスから値を読み取るコードを説明する記事です。

http://lancelarsen.com/reading-values-from-assemblyinfo-cs/

それが役に立てば幸い。

于 2019-02-21T06:01:25.013 に答える
0

x64環境でx86用にコンパイルされたアセンブリをロードしようとしているようです。その逆も同様です。

このコードが存在するアセンブリがターゲットと同じ環境用に構築されていることを確認してください。読んだように聞こえる例でアセンブリを取得できます。

于 2012-05-08T12:08:04.437 に答える
0

Assembly.GetName()。Versionを続行できます。ここで、アセンブリはクラスのタイプである可能性があります。

public class Test
{
    public static void Main()
    {
        Console.WriteLine("Current assembly : " + typeof(Test).Assembly.GetName().Version);
    }
}

私が取り組んでいるテストアプリケーションについて、上記のコードを使用して以下の詳細を示します。

ここに画像の説明を入力してください

于 2019-02-15T12:55:13.857 に答える