Как я могу пометить AssemblyVersion как FileVersion в двоичном файле - PullRequest
7 голосов
/ 28 февраля 2020

Я использую функцию Roslyn для генерации номера версии из текущей даты / времени .

Я вижу, что автоматически сгенерированный номер версии на основе даты / времени помечается правильно как AssemblyVersion, и Я могу прочитать его во время выполнения, используя API.

Вопрос: Как получить тот же автоматически сгенерированный номер версии на основе даты и времени с отметкой версия файла , чтобы я мог щелкнуть правой кнопкой мыши по сборке в проводнике windows и увидеть " Версия файла "на вкладке Сведения

Я вижу, когда я явно помечаю номер версии (скажем, 1.2.3.4), он работает нормально, но не с автоматически сгенерированной

Я не использую AssemblyInfo. cs и хотели бы установить атрибуты в .csproj

enter image description here

Я использую do tnet cli для сборки, используя нижеприведенный csproj, например:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <AssemblyVersion>1.0.*</AssemblyVersion>
    <FileVersion>1.0.*</FileVersion>
    <Deterministic>false</Deterministic>
    <PackageId>Demo</PackageId>
    <Company>My Company</Company>
    <Copyright>Copyright © Xyzzy 2020</Copyright>
    <Description>Description</Description>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
    <GenerateAssemblyFileVersionAttribute>true</GenerateAssemblyFileVersionAttribute>
    <GenerateAssemblyTitleAttribute>true</GenerateAssemblyTitleAttribute>
    <GenerateAssemblyConfigurationAttribute>true</GenerateAssemblyConfigurationAttribute>
    <GenerateAssemblyCompanyAttribute>true</GenerateAssemblyCompanyAttribute>
    <GenerateAssemblyProductAttribute>true</GenerateAssemblyProductAttribute>
    <GenerateAssemblyCopyrightAttribute>true</GenerateAssemblyCopyrightAttribute>
    <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
    <GenerateAssemblyInformationalVersionAttribute>true</GenerateAssemblyInformationalVersionAttribute>
  </PropertyGroup>
</Project>

Ответы [ 2 ]

4 голосов
/ 02 марта 2020

Согласно проекту Microsoft.NET.GenerateAssemblyInfo.targets, если вы не укажете свойство FileVersion и зададите для GenerateAssemblyFileVersionAttribute значение false, тогда значение свойства FileVersion будет равно свойству AssemblyVersion.

Попробуйте изменить файл csproj следующим образом:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>

    <AssemblyVersion>1.0.*</AssemblyVersion>

    <!-- Comment or delete this line. -->
    <!-- <FileVersion>1.0.*</FileVersion> -->

    <Deterministic>false</Deterministic>
    <PackageId>Demo</PackageId>
    <Company>My Company</Company>
    <Copyright>Copyright © Xyzzy 2020</Copyright>
    <Description>Description</Description>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <GenerateAssemblyInfo>true</GenerateAssemblyInfo>

    <!-- Set this attribute to false. -->
    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>

    <GenerateAssemblyTitleAttribute>true</GenerateAssemblyTitleAttribute>
    <GenerateAssemblyConfigurationAttribute>true</GenerateAssemblyConfigurationAttribute>
    <GenerateAssemblyCompanyAttribute>true</GenerateAssemblyCompanyAttribute>
    <GenerateAssemblyProductAttribute>true</GenerateAssemblyProductAttribute>
    <GenerateAssemblyCopyrightAttribute>true</GenerateAssemblyCopyrightAttribute>
    <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
    <GenerateAssemblyInformationalVersionAttribute>true</GenerateAssemblyInformationalVersionAttribute>
  </PropertyGroup>
</Project>

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

0 голосов
/ 02 марта 2020

В файле AssemblyInfo.cs вы можете установить свойства файла (на вкладке «Сведения»), такие как описание файла и версия файла:

[assembly: AssemblyDescription("Scratch")]
[assembly: AssemblyFileVersion("1.2.3.4")]

enter image description here

Ниже приведены различные атрибуты AssemblyFile:

FileVersionInfo.Comments = AssemblyDescription
FileVersionInfo.CompanyName = AssemblyCompany
FileVersionInfo.FileDescription = AssemblyTitle
ФайлVersionInfo.FileVersion = Assembly_FileVersion = Assembly LegalCopyright = AssemblyCopyright
FileVersionInfo.LegalTrademarks = AssemblyTrademark
FileVersionInfo.ProductName = AssemblyProduct
FileVersionInfo.ProductVersion = AssemblyInformationalVersion

Примечание:

  • * 10 ** AssemblyVersion :

    Указывает версию присваиваемой сборки.

  • AssemblyFileVersion :

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

  • AssemblyInformationalVersion :

    Определяет дополнительную информацию о версии для манифеста сборки.


Также обратите внимание, что номер версии файла фактически находится в конце файла DLL. Откройте DLL в текстовом редакторе и прокрутите до конца, в конце второй последней строки:

cbff18129f3 NUL NUL FF SOH NUL BEL 1.0.0.0 NUL NUL SOH NUL

Вы можете изменить версию в текстовом файле, но она не будет работать, она сохранит старая версия. Вероятно, вы могли бы выяснить, что представляет собой двоичная блокировка для номера версии, выполнив WinDiff / DiffMerge до и после установки AssemblyFileVersion в AssemblyInfo.cs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...