C# *obj目录中的.dll.licenses文件不是使用TeamCity中的msbuild创建的

C# *obj目录中的.dll.licenses文件不是使用TeamCity中的msbuild创建的,c#,asp.net-mvc,msbuild,teamcity,visual-studio-2015,C#,Asp.net Mvc,Msbuild,Teamcity,Visual Studio 2015,我正在将我们的TeamCity项目从VS2012升级到VS2015,在编译我们的MVC应用程序时遇到了一个问题 旧的MSBuild(v4.0.30319.34209)在obj目录中生成一个名为MyApplication.Web.Mvc.dll.licenses的文件,这显然是构建所必需的,但我们不知道该文件的实际用途 新的MSBuild(v14.0.23107.0)未创建此MyApplication.Web.Mvc.dll.licenses文件,因此生成失败,出现以下错误: CSC error

我正在将我们的TeamCity项目从VS2012升级到VS2015,在编译我们的MVC应用程序时遇到了一个问题

旧的MSBuild(v4.0.30319.34209)在obj目录中生成一个名为
MyApplication.Web.Mvc.dll.licenses
的文件,这显然是构建所必需的,但我们不知道该文件的实际用途

新的MSBuild(v14.0.23107.0)未创建此
MyApplication.Web.Mvc.dll.licenses
文件,因此生成失败,出现以下错误:

CSC error CS1566: Error reading resource 'MyApplication.Web.Mvc.dll.licenses' 
-- 'Could not find file 'C:\BuildAgent\work\58ddf5f1234d8c8a\application\MyApplication\MyApplication.Web.Mvc\obj\Release\MyApplication.Web.Mvc.dll.licenses'.' 
我一直在机器上通过cmd手动运行构建,每当使用旧的msbuild而不是新的msbuild运行构建时,就会创建
dll.licenses
文件


该文件是在运行VS2015的开发机器上创建的,而不是在Teamcity构建服务器上创建的。所以,在我看来,还有什么东西过时了?

在谷歌搜索了一段时间后,我偶然发现了

这里建议的解决方案是安装。我们使用默认安装选项在运行Windows server 2012 R2的TeamCity build服务器上执行了此操作,重新启动后,我们的构建再次工作


希望这有帮助:)

可能对某人有所帮助:


安装Windows 10 SDK并重新启动服务器后,我已将
/p:VisualStudioVersion=14.0/p:TargetFrameworkVersion=v4.5.2
添加到我的msbuild.exe中。这就解决了我的问题。

在使用VisualBuild构建时,我们遇到了同样的问题。 我找到了一个没有安装Win10 SDK的解决方案:

在项目属性编译设置中,我们添加了如下“预构建事件命令行”:

pushd "%VS120COMNTOOLS%..\..\VC"
call vcvarsall.bat
popd
pushd $(ProjectDir)\"My Project"
lc /target:$(TargetFileName) /complist:licenses.licx /outdir:"..\obj\$(ConfigurationName)"
popd
popd
此命令使用(较旧的)VS12工具,并在生成项目之前手动启动lc编译器工具,并将licenses.licx文件编译到*.licenses资源文件中。答案“安装Windows 10 SDK”基本正确。 但还有一个陷阱:SDK的现有版本不止一个:

通过撰写本评论:

  • 2015年7月(版本10.0.26624.0)包含.NET Framework 4.6 SDK
  • 2015年11月(版本10.0.10586.212)包含.NET Framework 4.6.1 SDK
  • 2016年8月(版本10.0.14393.0)包含.NET Framework 4.6.2 SDK
检查VS 2015输出以及调用LC.exe的版本。然后在构建服务器上安装适当的SDK。别忘了安装Microsoft Build Tools 2015


注意:我的构建目标是.net 4.5,但需要使用2015工具在TeamCity上构建上述版本。

在我的情况下,TFS使用的是旧SDK文件夹中的许可证编译器
lc.exe

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\lc.exe
而不是

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\LC.exe
通过向生成定义添加以下msbuild参数,解决了此问题:

/p:FrameworkOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2"

您还可以通过在生成服务器上安装visual studio并添加visual studio生成步骤来替换2015 msbuild步骤,从而消除这些问题并使您的生活更轻松这是一种密切相关但略有不同的情况,因为我使用Jenkins来控制生成

我不得不做一些改变

  • 已在生成服务器上安装Windows 10 SDK。在我的例子中,安装SDK“暴露”了一个基本错误,即MSBuild没有生成*.dll.licenses文件
  • 在我的构建参数中添加了/tv:14.0(/ToolsVersion:14.0)
  • /p:Configuration=Release/p:VisualStudioVersion=14.0/tv:14.0/详细程度:正常

  • 在执行MSBuild步骤之前,作为一个步骤手动创建许可证文件。下面的命令创建文件“myproject.dll.licenses”
  • cd“C:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.2工具”

    \lc.exe/target:MyProject.dll/complist:“C:\Program Files(x86)\Jenkins\jobs\MyProject\workspace\MyProject\licenses.licx”/i:“C:\Program Files\nsoftware\E-Payment Integrator V6.NET Edition\lib\nsoftware.InPayWeb.dll”/outdir:“C:\Program Files(x86)\Jenkins\jobs\MyProject\workspace\MyProject\MyProject\obj\Release”


    我使用Atlassian竹子作为我们的构建服务器,但在其他方面也存在与这里描述的完全相同的问题。我尝试了这个线程中的每一个解决方案,但都没有成功。最后,我使用了Visual Studio 2017附带的新版本MSBuild,突然间我的许可证dll被正确创建。在我的例子中,可以在以下位置找到MSBuild.exe:


    C:\Program Files(x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe在本例中,我们使用Atlassian竹子作为生成服务器,生成代理运行Windows server 2012(而不是R2)。因此,安装Windows 10 SDK或Visual Studio Build Tools 2017或2019不是一个选项,因为它不会安装在Windows Server 2012上,因为它不符合系统要求

    我在VS项目中添加了一个预构建事件。(感谢约瑟夫·哈斯林格的支持)

    添加到项目属性的预生成事件使用以下命令调用PowerShell脚本:
    powershell.exe-ExecutionPolicy旁路-NoProfile-NonInteractive-File$(ProjectDir)pre-build.ps1$(ProjectDir)$(TargetFileName)

    该命令基于来自的命令


    我正在将
    ExecutionPolicy
    设置为
    Bypass
    ,以防有人不将其设置为
    无限制的
    。那么你大概有一个?是的,我发现那是罪魁祸首。我仍然存在Visual Studio 2015无法生成.licenses文件的问题。我计划在找到解决方案后发布解决方案。编辑:我的意思是MSBuild v14不创建.licenses文件。您是否打开了详细的生成输出,并查看了带有.licx文件的项目的完整生成输出?@Nanhydrin是的,我刚刚发布了,并且服务器上的输出与我机器上的输出不同。在服务器上,它只是输出信息,就像您调用了
    lc.exe
    而没有
    .licx