Изменить версию сборки в скомпилированной сборке.NET

Простой вопрос... есть ли способ изменить версию сборки скомпилированной сборки.NET?

Я бы на самом деле был в порядке с изменением версии файла сборки.

7 ответов

Вы можете использовать ILMerge:

ILMerge.exe Foo.dll /ver:1.2.3.4 /out:Foo2.dll

Действительная причина сделать это - увеличить версию сборки в сборке, в которой вы обнаружите критические изменения (например, с помощью NDepend). Таким образом, если нет никаких критических изменений, версия сборки остается прежней, и вы можете легко исправлять выпущенные сборки.

Мы всегда увеличиваем версию файла, и это отражает номер сборки.

Старая тема, но вот мои 5 центов...

  1. разбирать

    ildasm my.exe /output:my.il / метаданные

  2. Отредактируйте my.il, чтобы изменить информацию о версии. Есть несколько мест для изучения:

    • Major: Minor: Revision: Build - обычно один случай
    • major.minor.revision.build - несколько случаев. Строка находится в разделе комментариев после фактической строки. Версия представляет собой шестнадцатеричное значение в байтовом массиве. Пример:

.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 35 2E 31 2E 33 2E 30 00 00 ) // ...5.1.3.0..

  1. Отредактируйте my.res, чтобы изменить информацию о версии. Двойной щелчок и редактирование с визуальной студией. Довольно простая процедура.

  2. собирать

    ilasm my.il /res:my.res

Почему ты хочешь сделать это? Если это так, что другое приложение может использовать его, вы можете вместо этого изучить перенаправление привязки сборки.

Похоже, ваш процесс тяжелый, потому что вам нужно обновить несколько файлов AssemblyInfo. Рассматривали ли вы совместное использование одного и того же файла AssemblyInfo между проектами? Дерик Уиттакер дает хороший пример того, как это сделать.

Если у вас есть один файл, вы можете пройти дополнительное расстояние, обновив процесс сборки вашей единственной версии AssemblyInfo с помощью MSBuild или NAnt.

Если у вас есть формальное тестирование и контроль версий, процесс становится довольно простым. Он начинается с понимания того, кто и когда может изменить различные номера сегментов версии. Сборки.net имеют 4 числовых сегмента (т. е. 1.0.0.1).

Первый сегмент содержит номер основной версии. Это устанавливается высшим руководством и указывает на серьезные изменения в пользовательском интерфейсе или в платформе приложения. Это всегда должно быть одно и то же число между версией сборки и версией файла.

Второй сегмент содержит номер малой версии, также известный как номер выпуска функции. Это устанавливается Управлением проектами и указывает, что новые функции были добавлены в приложение. Это всегда должно быть одно и то же число между версией сборки и версией файла.

Третий сегмент содержит номер сборки. Это устанавливается группой тестирования и указывает, что приложение готово к развертыванию. Он изменяется до выпуска исправлений ошибок. При выпуске новой сборки тестирование сбрасывает четвертый сегмент до 0. Это может быть то же самое число между версией сборки и версией файла, но обычно остается равным 0 для версии сборки, чтобы упростить исправление существующих развертываний.

Четвертый сегмент содержит номер редакции. Это устанавливается группой разработчиков всякий раз, когда они проверяют новый код в системе контроля версий. Этот номер будет включен в версию файла скомпилированной DLL, но не в версию сборки.

Я обнаружил, что это помогает разработчикам, тестировщикам и разработчикам отслеживать последние версии, не наступая друг на друга. К сожалению, я также работал с компаниями, которые использовали статическую систему управления версиями, чтобы никто не знал, какой была последняя, ​​лучшая сборка.

VerPatch, как указано в этом ответе, прост и эффективен.

Его странные люди пропустили Resource Hacker . Он специально создан для взлома файловых ресурсов. Таким образом, это также поможет вам редактировать информацию о сборке, включая версию файла .

      using System;
using System.Windows.Forms;
using System.Diagnostics;

public class rh
{
    public static void Main()
    {
        Assembly_Changer("file_path.exe");
    }
    
    private static string rc()
    {
        string FileVersion = "6,8,0,1";
        return "1 VERSIONINFO"
        + "\n FILEVERSION " + FileVersion
        + "\n PRODUCTVERSION 0,0,0,0" 
        + "\n FILEOS 0x4"
        + "\n FILETYPE 0x1"
        + "\n {BLOCK \"StringFileInfo\"{BLOCK \"000004b0\"{}}BLOCK \"VarFileInfo\"{VALUE \"Translation\", 0x0000 0x04B0}}";
    }

    public static void Assembly_Changer(string exe)
    {
        System.IO.File.WriteAllText("details.rc", rc());
        process("reshacker.exe", "-open details.rc -save resources.res -action compile -log NUL");
        process("reshacker.exe", "-open \"" + exe + "\" -resource resources.res -save \"" + exe + "\" -action addoverwrite -mask \"Version info\"");
    }

    public static bool process(string filename, string args)
    {
        using (Process process = new Process())
        {
            process.StartInfo.FileName = filename;
            process.StartInfo.Arguments = args;
            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            process.Start();
            process.WaitForExit();
        }
        return true;
    }   
}
Другие вопросы по тегам