2013-10-18 60 views
4

我使用以下代码获取存储在硬盘上的文件的C#程序集文件版本。从解压缩中获取程序集文件版本,无需解压缩

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

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

+0

SharpZipLib可以解压缩到一个'MemoryStream',但'GetVersionInfo()'似乎只能接受文件名... – Medinoc

+0

如果你读了一个流,你不需要写入文件系统。使用反射来加载它 – giammin

+0

我正在使用DotNetZip,它可以解压到一个'MemoryStream',我发现GetVersionInfo只接受本地路径,这就是我问的原因。 @giammin你能告诉我,如何使用反射到流? –

回答

5

对不起,但你不能没有一个物理文件。

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

最后一个念头:也许你有写权限的临时文件夹中的文件:Path.GetTempPath

+0

请给我一个代码,以便我可以验证你没有编造:) –

+0

谢谢你的代码。 –

+0

可以在不转到文件的情况下阅读版本信息,但需要直接读取PE文件信息以查找资源部分,然后解析RT_VERSION版本。 – William