我使用以下代码获取存储在硬盘上的文件的C#程序集文件版本。从解压缩中获取程序集文件版本,无需解压缩
var vInfo = FileVersionInfo.GetVersionInfo("assemblyPath").FileVersion;
如何在不打开包装的情况下获取存档文件中的文件的装配文件版本?想象一下,您没有写入硬盘的权限。您可能会使用一些内存库来打开存档并检查您需要知道的内容。
我使用以下代码获取存储在硬盘上的文件的C#程序集文件版本。从解压缩中获取程序集文件版本,无需解压缩
var vInfo = FileVersionInfo.GetVersionInfo("assemblyPath").FileVersion;
如何在不打开包装的情况下获取存档文件中的文件的装配文件版本?想象一下,您没有写入硬盘的权限。您可能会使用一些内存库来打开存档并检查您需要知道的内容。
对不起,但你不能没有一个物理文件。
读取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
请给我一个代码,以便我可以验证你没有编造:) –
谢谢你的代码。 –
可以在不转到文件的情况下阅读版本信息,但需要直接读取PE文件信息以查找资源部分,然后解析RT_VERSION版本。 – William
SharpZipLib可以解压缩到一个'MemoryStream',但'GetVersionInfo()'似乎只能接受文件名... – Medinoc
如果你读了一个流,你不需要写入文件系统。使用反射来加载它 – giammin
我正在使用DotNetZip,它可以解压到一个'MemoryStream',我发现GetVersionInfo只接受本地路径,这就是我问的原因。 @giammin你能告诉我,如何使用反射到流? –