5

次のコードを使用して、ハード ドライブに保存されているファイルの C# アセンブリ ファイル バージョンを取得します。

var vInfo = FileVersionInfo.GetVersionInfo("assemblyPath").FileVersion;

アーカイブに保存されているファイルをアンパックせずにアセンブリ ファイル バージョンを取得するにはどうすればよいですか? ハードドライブへの書き込み権限がないことを想像してみてください。おそらく、アーカイブを開いて必要な情報を確認するために、メモリ内ライブラリを使用するでしょう。

4

2 に答える 2

7

申し訳ありませんが、物理ファイルがないとできません。

FileVersion を読み取る唯一の方法は、パスのみを受け入れるFileVersionInfo.GetVersionInfoを使用することです。

また、リフレクターを使用してファイルバージョンを読み取る方法を確認すると、使用できない安全でないネイティブ内部メソッドがいくつか表示されます...

private static string GetFileVersionString(IntPtr memPtr, string name)
{
    int num;
    string str = "";
    IntPtr zero = IntPtr.Zero;
    if (UnsafeNativeMethods.VerQueryValue(new HandleRef(null, memPtr), name, ref zero, out num) && (zero != IntPtr.Zero))
    {
        str = Marshal.PtrToStringAuto(zero);
    }
    return str;
}

たぶん、いくつかのDllImportで取得できます。しかし、これは私の知る限りではありません。

解決する場合は、 DotNetZipライブラリAssemblyVersionを使用できます。

Assembly assembly;
using (var data = new MemoryStream())
{
    using (ZipFile zip = ZipFile.Read(LocalCatalogZip))
    {
        zip["assembly.dll"].Extract(data);
    }
    data.Seek(0, SeekOrigin.Begin);

    assembly = Assembly.ReflectionOnlyLoad(data.ToArray());
}
var version = assembly.GetName().Version;

- - - - - - - - アップデート - - - - - - - - -

最後の考え: おそらく一時フォルダーにファイルを書き込む権限がある: Path.GetTempPath

于 2013-10-18T13:26:33.183 に答える
0

Nuget パッケージ Mono.Cecil を使用できます

ModuleDefinition.ReadModule(stream)

必要なすべてのアセンブリ情報を含む ModuleDefinition を取得します。

于 2020-03-11T09:55:58.253 に答える