26

大規模なプログラムの1つの小さな機能は、フォルダー内のアセンブリを調べ、古いアセンブリを最新バージョンに置き換えます。これを実現するには、実行中のプロセスに実際にアセンブリをロードせずに、既存のアセンブリファイルのバージョン番号を読み取る必要があります。

4

5 に答える 5

44

この記事で次のことがわかりました。

using System.Reflection;
using System.IO;

...

// Get current and updated assemblies
AssemblyName currentAssemblyName = AssemblyName.GetAssemblyName(currentAssemblyPath);
AssemblyName updatedAssemblyName = AssemblyName.GetAssemblyName(updatedAssemblyPath);

// Compare both versions
if (updatedAssemblyName.Version.CompareTo(currentAssemblyName.Version) <= 0)
{
    // There's nothing to update
    return;
}

// Update older version
File.Copy(updatedAssemblyPath, currentAssemblyPath, true);
于 2008-10-09T16:21:53.833 に答える
14

ファイルによっては、1つのオプションがありますFileVersionInfo-つまり

FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(path)
string ver = fvi.FileVersion;

問題は、これが属性を持つコードに依存し、[AssemblyFileVersion]属性と一致すること[AssemblyVersion]です。

ただし、最初に他の人が提案した AssemblyName オプションを確認すると思います。

于 2008-10-09T16:23:37.887 に答える
9

を使用AssemblyName.GetAssemblyName("assembly.dll");して、名前を解析します。MSDNによると:

これは、ファイルにアセンブリマニフェストが含まれている場合にのみ機能します。この方法では、ファイルが開閉されますが、アセンブリはこのドメインに追加されません。

于 2008-10-09T16:21:33.383 に答える
0

AssemblyLoadContextを使用した Joel の回答の.netcore更新:

using System.IO;
using System.Reflection;
using System.Runtime.Loader;

...

// Get current and updated assemblies
AssemblyName currentAssemblyName = AssemblyLoadContext.GetAssemblyName(currentAssemblyPath);
AssemblyName updatedAssemblyName = AssemblyLoadContext.GetAssemblyName(updatedAssemblyPath);

// Compare both versions
if (updatedAssemblyName.Version.CompareTo(currentAssemblyName.Version) <= 0)
{
    // There's nothing to update
    return;
}

// Update older version
File.Copy(updatedAssemblyPath, currentAssemblyPath, true);

これは、Windows サービスによって実行されている (およびロックされている) DLL を分析するのに役立ちますAppDomain

于 2021-02-26T17:44:43.370 に答える