从归档获取程序集文件版本而不解压缩

时间:2013-10-18 12:31:59

标签: c# .net-assembly archive

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

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

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

2 个答案:

答案 0 :(得分:6)

很抱歉,但如果没有文件,你就不能这样做。

阅读FileVersion的唯一方法是使用仅接受路径的FileVersionInfo.GetVersionInfo

如果您使用反射器来查看它如何读取fileversion,那么您将看到一些您不能使用的不安全的本机内部方法......

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

答案 1 :(得分:0)

您可以使用Nuget程序包Mono.Cecil

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TimerApplication extends JFrame implements ActionListener{
    private javax.swing.Timer timer;
    private JTextField seconds;
    private JTextField minutes;
    private int nTimeDelay = 50;
    private int ticks = 0;

    public static void main(String[] args) {
        TimerApplication frame = new TimerApplication();
        frame.setSize(300, 100);
        frame.createGUI();
        frame.setVisible(true);
    }

    private void createGUI(){
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout());;
        seconds = new JTextField();
        minutes = new JTextField();
        window.add(minutes);
        window.add(seconds);
        timer = new javax.swing.Timer(50, this);
        timer.start();
        ticks=0;
   }

   @Override
   public void actionPerformed(ActionEvent event) {
       if(event.getSource()==timer)
       {
           minutes.setText(String.format("%02d", (ticks*(nTimeDelay)/1000) / 60));
           seconds.setText(String.format("%02d",(ticks*(nTimeDelay)/1000) % 60));
           ticks++;
       }    
   }
}

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