【问题标题】:In Visual Studio 2010 why is the .NETFramework,Version=v4.0.AssemblyAttributes.cpp file created, and can I disable this?在 Visual Studio 2010 中,为什么要创建 .NETFramework,Version=v4.0.AssemblyAttributes.cpp 文件,我可以禁用它吗?
【发布时间】:2010-06-23 18:17:54
【问题描述】:

我最近升级到 Visual Studio 2010。现在,当我构建项目时,我得到一行内容:

1>  .NETFramework,Version=v4.0.AssemblyAttributes.cpp

我了解到这是新构建引擎 msbuild.exe 的结果,但该文件实际上是自动创建的,并放置在我的本地临时目录中 (c:\Documents and Settings\me\Local Settings\温度)。有谁知道为什么要创建这个文件,我是否可以禁用它的创建?

顺便说一句,在我看来,它似乎没有任何用处。见下文:

#using <mscorlib.dll>
[assembly: System::Runtime::Versioning::TargetFrameworkAttribute(L".NETFramework,Version=v4.0", FrameworkDisplayName=L".NET Framework 4")];

正如http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/15d65667-ac47-4234-9285-32a2cb397e32 所报告的,它偶尔会引起问题。因此,非常感谢有关此文件的任何信息,以及如何避免其自动创建。谢谢!

【问题讨论】:

    标签: .net c++ visual-studio-2010


    【解决方案1】:

    这对所有语言都是通用的(C#、VB 和 F# 也有类似的东西)。

    您可以禁用它的一种方法是覆盖 GenerateTargetFrameworkMonikerAttribute 目标:

    <!-- somewhere after the Import of Microsoft.somelanguage.targets -->
    <Target Name="GenerateTargetFrameworkMonikerAttribute" />
    

    在您的项目文件中。

    【讨论】:

    • 我按照您的建议手动编辑了 vcxproj 文件并添加了该行,并且它起作用了。但是在项目属性页面中是否有设置或位置添加它?更重要的是,它安全吗?我失去了什么?
    • 查看此处了解 TargetFrameworkAttribute 功能支持的内容:msdn.microsoft.com/en-us/library/dd456789.aspx
    • 有趣。由于该项目不包含任何 WCF、IIS 或 Web 任何东西,我想按照您的建议覆盖它是安全的。但我很惊讶这曾经出现过。有什么想法为什么会出现?
    • 我同意省略是安全的。我对 C++ 链接器一无所知,所以我对警告一无所知。
    • 不幸的是,如上所述,禁用 GenerateTargetFrameworkMonikerAttribute 会产生副作用,即任何 C# 项目都不会再次更新。如果您将 Visual Studio 的输出详细程度设置为 Diagnostic,如果您构建 C# 项目,您将获得以下行作为构建日志的第一个条目: > 项目 'FooBar' 不是最新的.缺少输入文件 > 'c:\users\\appdata\local\temp\.netframework,version=v4.5.assemblyattributes.cs'。
    【解决方案2】:

    看看 c:\program files\msbuild\microsoft.cpp\v4.0\microsoft.buildsteps.targets。它包含 GenerateTargetFrameworkMonikerAttribute 目标,即生成文件的目标。 Condition 元素确定它何时运行,GenerateTargetFrameworkAttribute 是值。如果项目设置要求 /clr 构建,那将始终如此。目标中的注释非常具有误导性,关于预编译头文件的喧嚣与目标的目的无关。

    它在 .cpp 帮助文件中生成的 [TargetFrameworkAttribute] 很重要,它告诉运行程序的机器上的 CLR 需要存在什么最低版本的 .NET 才能成功执行程序。它的主要用途是自动 launch the installer 获取所需的 .NET 版本,非常好的功能。

    LNK4221很常见,没有牙齿,可以无视。遗憾的是,链接器没有提供抑制警告的记录方法,基本问题是它不能足够具体地抑制 only 这个警告。禁止帮助程序 .cpp 需要编辑 .targets 文件并破坏自动安装功能,我不建议这样做。

    【讨论】:

    • 非常感谢您提供的所有信息!有没有什么地方我可以阅读更多关于 msbuild 和它使用的这些 XML 文件的信息,这些文件可能比msdn.microsoft.com/en-us/library/0k6kkbsd.aspx 更清晰?我什至在 MSDN 文档中找不到 GenerateTargetFrameworkMonikerAttribute 目标。至于警告,我公司的政策是构建必须是无警告的,因为它们经常指向代码臭。
    • 不,这些是实现细节,与 link.exe 的内部结构没有什么不同。它们恰好是可读的,不是一件坏事。让link.exe 完全没有警告是很困难的,你不能抑制警告。你也不能用它们使构建失败,所以很少有程序员关心。也许 VS2010 还没有为贵公司的黄金时间做好准备。发布到 connect.microsoft.com 以请求功能更改。
    • +1 用于猜测。 @Brian 对他的回答的评论提供了一个链接到它的用途:msdn.microsoft.com/en-us/library/dd456789.aspx
    • 对于 Visual Studio 2013,我通过将 /IGNORE:4221 添加到项目属性->链接器->命令行的附加选项框中成功地抑制了 LNK4221 警告。请注意,它会抑制该警告的所有出现,但这对我来说没问题。
    【解决方案3】:

    我通过以下步骤解决了这个问题:

    1. 清理解决方案

    2. 关闭解决方案

    3. 输入运行命令%temp%,删除所有文件

    4. 通过单击项目保存文件夹中的项目解决方案文件打开解决方案。

    5. 对其中一个项目进行重建。然后关闭Visual Studio 2010(是的整个开发环境),然后重新打开解决方案文件。

      重建似乎重新创建了丢失的文件,但 Visual Studio 没有注意到它,因此您必须将其关闭并重新打开它才能再次正确看到该文件。

    【讨论】:

    • 据我所知,Temp 文件夹可能包含当前运行的应用程序所需的文件或下次 Windows(或创建它的应用程序)启动时所需的文件。所以从 %temp% 中删除所有文件是不安全的。
    【解决方案4】:

    首先,@Brian 的回答纠正了这种情况,我为其他有用的回答发出了 4x+1,这有助于快速诊断和解决我遇到的问题。

    想要包含一个我基于此在我的上下文中诊断出的问题的转储。

    此功能合成项目语言的源文件,在编译流中创建assembly:attribute。

    当 WAS 或其他托管环境需要能够推断目标框架和其他此类情况时,此文件/进程是必要的Example MSDN article (relating to usage with WAS)。它只是一个属性,所以它是惰性的,不用担心......

    在没有这种依赖的情况下,它会变得更有趣。除了冗余、制作更大的二进制文件和加热处理器之外,在 TeamCity 中,为增量构建配置的清理程序会在重新构建之前删除此文件。然而,不幸的副作用是构建的依赖关系检查错误地推断出重建是必要的,如通过指定/v:d[etailed] 开启日志记录时的示例消息所示:-

    [CoreCompile] 输入文件“C:\BuildAgent\temp\buildTmp.NETFramework,Version=v4.0,Profile=Client.AssemblyAttributes.cs”比输出文件“bin\Debug\DLLNAME.xml”更新。

    底线是 CSC 被不恰当地调用(在我们的例子中,从那里有显着的下游影响)

    其他说明:

    • 必须查看 MS 目标以查看这是否仅适用于特定配置文件 [正如 @AlainA 的回答中提到的那样](我的具体情况是使用 .NET 4.0 客户端配置文件)

      李>
    • 如上面的消息所示,可能涉及的一个微妙之处是 XML 文档的存在或不存在,在我的上下文中就是这种情况。

    【讨论】:

      【解决方案5】:

      该文件用于嵌入 TargetFrameworkMoniker .NET 程序集属性。那是为了(将来)帮助主机正确使用适当的 CLR。 (抱歉含糊不清,我不记得其他人是专家)。即',实际上是有原因的:-)

      我不知道为什么会有警告 - 调查一下。

      丹/MSBuild

      【讨论】:

      【解决方案6】:

      关闭 VS

      使用记事本打开每个 .vbproj 文件并删除以下行:

      结束了!

      【讨论】:

        猜你喜欢
        • 2011-07-26
        • 1970-01-01
        • 2011-09-11
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多