【问题标题】:Get assembly file version from an archive without unpacking从存档中获取程序集文件版本,无需解包
【发布时间】:2013-10-27 07:16:34
【问题描述】:

我使用以下代码为存储在硬盘上的文件获取 C# 程序集文件版本。

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

如何在不解压缩的情况下获取存储在存档中的文件的程序集文件版本?想象一下,您没有写入硬盘的权限。您可能会使用一些内存库来打开存档并检查您需要知道的内容。

【问题讨论】:

  • SharpZipLib 可以解压到MemoryStream,但GetVersionInfo() 似乎只接受一个文件名...
  • 如果您读取流,则不需要将其写入文件系统。使用反射来加载它
  • 我正在使用 DotNetZip,它也可以解压缩到 MemoryStream,我发现 GetVersionInfo 只接受本地路径,这就是我问的原因。 @giammin 你能告诉我,如何对流使用反射吗?
  • @OndrejJanacek 抱歉,您只能获得版本而不是文件版本
  • @giammin 至少有点……

标签: c# .net-assembly archive


【解决方案1】:

抱歉,您不能没有物理文件。

读取 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;

----------------更新-----------------

最后的想法:也许您有权在临时文件夹中写入文件:Path.GetTempPath

【讨论】:

  • 请给我一个代码,这样我就可以验证你没有编造它:)
  • 不去文件也可以读取版本信息,但是需要直接读取PE文件信息来定位资源部分,然后解析RT_VERSION版本。
  • @William 我不太了解你。
  • @OndrejJanacek William 建议以二进制模式读取 dll 文件(或流,等等)并找到版本信息的确切位置。将您的版本设置为1.23.456.7890,编译并在您的 dll 中搜索此字符串。 PE 格式有据可查en.wikipedia.org/wiki/Portable_Executable
  • 这个解决方案的问题是Assembly.ReflectionOnlyLoad 实际上将程序集加载到您的应用程序域中,并且一旦加载,它就会停留在那里。如果您第二次尝试从同一个程序集中获取版本,则会出现错误(至少,我做到了)。
【解决方案2】:

你可以使用 Nuget 包 Mono.Cecil

ModuleDefinition.ReadModule(stream)

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

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2012-03-18
    • 2011-02-18
    相关资源
    最近更新 更多