Как получить версию сборки без загрузки? - PullRequest
21 голосов
/ 09 октября 2008

Одна небольшая функция большой программы проверяет сборки в папке и заменяет устаревшие сборки последними версиями. Для этого необходимо прочитать номера версий существующих файлов сборок без фактической загрузки этих сборок в выполняющийся процесс.

Ответы [ 4 ]

33 голосов
/ 09 октября 2008

Я нашел следующее в этой статье .

using System.Reflection;
using System.IO;

...

// Get current and updated assemblies
AssemblyName currentAssemblyName = AssemblyName.GetAssemblyName(currentAssemblyPath);
AssemblyName updatedAssemblyName = AssemblyName.GetAssemblyName(updatedAssemblyPath);

// Compare both versions
if (updatedAssemblyName.Version.CompareTo(currentAssemblyName.Version) <= 0)
{
    // There's nothing to update
    return;
}

// Update older version
File.Copy(updatedAssemblyPath, currentAssemblyPath, true);
11 голосов
/ 09 октября 2008

В зависимости от файлов один из вариантов может быть FileVersionInfo - т.е.

FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(path)
string ver = fvi.FileVersion;

Проблема в том, что это зависит от кода, имеющего атрибут [AssemblyFileVersion], и его соответствия атрибуту [AssemblyVersion].

Я думаю, что сначала я посмотрю на варианты AssemblyName, предложенные другими.

9 голосов
/ 09 октября 2008

Используйте AssemblyName.GetAssemblyName("assembly.dll");, затем проанализируйте имя. Согласно MSDN :

Это будет работать, только если файл содержит манифест сборки это метод вызывает открытие файла и закрыто, но сборки нет добавлен в этот домен.

2 голосов
/ 13 февраля 2014

Только для справки: Вот как получить версию файла в C # .NET Compact Framework. Он в основном из OpenNETCF, но довольно короткий и сложный, поэтому можно копировать и вставлять. Надеюсь, это поможет ...

public static Version GetFileVersionCe(string fileName)
{
    int handle = 0;
    int length = GetFileVersionInfoSize(fileName, ref handle);
    Version v = null;
    if (length > 0)
    {
        IntPtr buffer = System.Runtime.InteropServices.Marshal.AllocHGlobal(length);
        if (GetFileVersionInfo(fileName, handle, length, buffer))
        {
            IntPtr fixedbuffer = IntPtr.Zero;
            int fixedlen = 0;
            if (VerQueryValue(buffer, "\\", ref fixedbuffer, ref fixedlen))
            {
                byte[] fixedversioninfo = new byte[fixedlen];
                System.Runtime.InteropServices.Marshal.Copy(fixedbuffer, fixedversioninfo, 0, fixedlen);
                v = new Version(
                    BitConverter.ToInt16(fixedversioninfo, 10), 
                    BitConverter.ToInt16(fixedversioninfo,  8), 
                    BitConverter.ToInt16(fixedversioninfo, 14),
                    BitConverter.ToInt16(fixedversioninfo, 12));
            }
        }
        Marshal.FreeHGlobal(buffer);
    }
    return v;
}

[DllImport("coredll", EntryPoint = "GetFileVersionInfo", SetLastError = true)]
private static extern bool GetFileVersionInfo(string filename, int handle, int len, IntPtr buffer);
[DllImport("coredll", EntryPoint = "GetFileVersionInfoSize", SetLastError = true)]
private static extern int GetFileVersionInfoSize(string filename, ref int handle);
[DllImport("coredll", EntryPoint = "VerQueryValue", SetLastError = true)]
private static extern bool VerQueryValue(IntPtr buffer, string subblock, ref IntPtr blockbuffer, ref int len);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...