TargetFramework FrameworkDisplayName пусто

Какова эффективная разница между следующими атрибутами сборки, то есть какая разница во время выполнения, если таковая имеется, может возникнуть.

[assembly: TargetFramework(".NETFramework,Version=v4.5.2", 
                            FrameworkDisplayName = "")]

[assembly: TargetFramework(".NETFramework,Version=v4.5.2",
                           FrameworkDisplayName = ".NET Framework 4.5.2")]

Первый создается MSBuild (с предупреждениями), когда на сборочной машине не установлены эталонные сборки 4.5.2 (через пакет таргетинга). Второе происходит, когда на сборочной машине установлены эталонные сборки (предупреждения исчезают). Я чувствую, что 2-е как-то более правильно, но у меня нет конкретных фактов, подтверждающих это. Оба бинарных файла работают.

1 ответ

TargetFramework

Определяет версию.NET Framework, для которой была скомпилирована конкретная сборка.

Атрибут TargetFrameworkAttribute может указывать свойство FrameworkDisplayName, чтобы предоставить более информативную строку версии.NET Framework, которая подходит для отображения клиентам сборки

Источник: https://msdn.microsoft.com/en-us/library/system.runtime.versioning.targetframeworkattribute(v=vs.110).aspx

FrameworkDisplayName

Получает отображаемое имя версии.NET Framework, для которой была построена сборка.

Источник: https://msdn.microsoft.com/en-us/library/system.runtime.versioning.targetframeworkattribute.frameworkdisplayname(v=vs.110).aspx

Пример ниже подчеркивает правильность 2-й строки, которую вы упомянули:

В следующем примере применяется TargetFrameworkAttribute к сборке и назначает оба значения свойств, чтобы указать, что сборка была построена с использованием.NET Framework 4.5.2.

using System;
using System.Runtime.Versioning;

[assembly:TargetFramework(".NETFramework,Version=v4.5.2", 
          FrameworkDisplayName = ".NET Framework, Version 4.5.2")]

namespace MyCompany.Utilities
{
   public class StringLibrary
   {
      // Members defined here.
   }
}

Я надеюсь, что это проясняет вопрос.

Для тех, кто посещает эту страницу в будущем и ищет способ исправить пустой "FrameworkDisplayName" (как и я), вы можете выполнить следующие шаги:

  • Перейдите в C:\Users\mudalig\AppData\Local\Temp
  • Найдите файл ".NETFramework,Version=[версия сборки.net].AssemblyAttributes.cs". например. .NETFramework,Version=v4.5.1.AssemblyAttributes.cs
  • Откройте файл и проверьте элемент "FrameworkDisplayName". Если он пуст, установите для него ожидаемое значение. (например, FrameworkDisplayName = ".NET Framework 4.5.1")

// используя System; using System.Reflection; [сборка: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5.1", FrameworkDisplayName = ".NET Framework 4.5.1")]

Некоторые сведения о том, почему это может быть важно. Иногда вам нужно убедиться, что ваши двоичные файлы воспроизводимы, то есть хеши должны совпадать при выполнении новой сборки. Если исходный или целевой компьютер имеет пустое / неправильное значение этого атрибута, метаданные двоичного файла (dll, exe) изменятся и не будут соответствовать другому.

Так было с нами, и мне пришлось потратить два дня, пытаясь найти решение. Надеюсь, это кому-то будет полезно.

Другие вопросы по тегам