无需压缩即可从档案中获取程序集文件版本

问题描述 投票:5回答:2

我使用以下代码来获取存储在硬盘驱动器上的文件的C#汇编文件版本。

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

我如何在不解压缩的情况下获得存储在档案中的文件的汇编文件版本?想象一下,您没有写硬盘驱动器的权限。您可能会使用一些内存库来打开存档并检查您需要了解的内容。

c# .net-assembly archive
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来获得。但这不是我所知。

如果您选择AssemblyVersion,则可以使用DotNetZip库:

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;

---------------- UPDATE -----------------

最后考虑:也许您有权在temp文件夹中写入文件:Path.GetTempPath


0
投票

您可以使用Nuget包Mono.Cecil

ModuleDefinition.ReadModule(stream)

您将获得一个ModuleDefinition,其中包含所有所需的程序集信息。

© www.soinside.com 2019 - 2024. All rights reserved.