0

以下程序集属性之间的有效差异是什么 - 即可能发生的运行时差异(如果有)。

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

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

当构建机器没有安装 4.5.2 参考程序集(通过目标包)时,第一个由 MSBuild 生成(带有警告)。第二个是在构建机器安装了参考程序集时产生的(警告消失)。我觉得第二个更正确,但没有任何具体事实来支持这一点。两个二进制文件似乎都可以工作。

4

2 回答 2

0

对于将来访问此页面的任何人,寻找一种方法来修复空的“FrameworkDisplayName”(就像我一样),您可以按照以下步骤操作:

  • 导航到 C:\Users\mudalig\AppData\Local\Temp
  • 查找文件“.NETFramework,Version=[assembly's .net version].AssemblyAttributes.cs”。例如。.NETFramework,Version=v4.5.1.AssemblyAttributes.cs
  • 打开文件并检查“FrameworkDisplayName”元素。如果为空,则将其设置为预期值。(例如,FrameworkDisplayName = ".NET Framework 4.5.1")

// 使用系统;使用 System.Reflection;[程序集:global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5.1", FrameworkDisplayName = ".NET Framework 4.5.1")]

为什么这可能很重要的一些背景。有时您需要确保您的二进制文件是可重现的,即当您进行新构建时哈希值应该匹配。如果源或目标机器的该属性值为空/不正确,则二进制文件(dll、exe)的元数据将发生变化,并且与另一个不匹配。

我们就是这种情况,我不得不花两天时间想出一个解决方案。希望这对某人有用。

于 2019-08-25T23:31:49.303 回答
0

目标框架

标识编译特定程序集的 .NET Framework 版本。

TargetFrameworkAttribute 特性可以指定一个 FrameworkDisplayName 属性来提供一个更具描述性的 .NET Framework 版本字符串,该字符串适合显示给程序集的客户端

来源:https ://msdn.microsoft.com/en-us/library/system.runtime.versioning.targetframeworkattribute(v=vs.110).aspx

框架显示名称

获取根据其构建程序集的 .NET Framework 版本的显示名称。

来源:https ://msdn.microsoft.com/en-us/library/system.runtime.versioning.targetframeworkattribute.frameworkdisplayname(v=vs.110).aspx

下面的示例强调了您提到的第二行的正确性:

以下示例将 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.
   }
}

我希望这可以解决这个问题。

于 2015-07-14T10:20:14.080 回答