Postsharp没有通过MSBuild在自定义配置中构建

时间:2017-02-10 12:28:38

标签: c# msbuild postsharp

我正在通过命令行在客户配置上运行MSBuild(比如在Visual Studio中看到的Debug,Release,除了我使用自己的配置)。

MSBuild build.msbuild /p:Configuration=Dev ...blah  
     

C:\ MyProject的\包\ PostSharp.4.3.9-α\工具\ PostSharp.targets(422,5):   错误MSB4036:找不到“GenerateBindingRedirects”任务。   检查以下内容:1。)项目文件中的任务名称是   与任务类的名称相同。 2.)任务类是   “public”并实现Microsoft.Build.Framework.ITask接口。   3.)在项目文件中或在位于的。* .tasks文件中正确声明任务   “C:\ windows \ Microsoft.NET \ Frame work64 \ v4.0.30319”目录。 [路径   我的项目文件]

这通常可以正常工作,但是当我有postharp时,它会抛出一个错误,如上所示。当我使用Debug或Release替换/ p:Configuration中的Dev时,它们工作正常。

我检查了.csproj并没有添加任何特殊内容,而不是我的开发配置。 我该怎么做才能解决这个问题?我尝试将postsharp软件包目录的内容复制到bin \ Dev文件夹中,但它仍然无法找到任务。

2 个答案:

答案 0 :(得分:1)

我在将PostSharp从2.1.6升级到6.0.27的.NET 4.0项目中遇到此错误,使用脚本突然启动MSBuild(版本4.7.3056)启动了Release版本。

问题是由于在GenerateBindingRedirects内部(在软件包目录中)声明的任务PostSharp.targets在.csproj内部没有相应的<UsingTask TaskName="Microsoft.Build.Tasks.GenerateBindingRedirects"

显然,“解决”最快的方法是在<PostSharpDisableDefaultBindingRedirects>True</PostSharpDisableDefaultBindingRedirects>内添加PostSharp.Custom.targets,如此处http://doc.postsharp.net/assembly-binding-resolution所示。但是根据项目的不同,可能会很危险。

这对我不起作用,因为我的项目的.NET框架太旧了,但是从理论上讲,一个解决方案是将软件包添加到项目中,并在.csproj中声明UsingTask元素:

Install-Package Microsoft.Build.Tasks.Core -Version 15.1.0

<UsingTask TaskName="Microsoft.Build.Tasks.GenerateBindingRedirects" AssemblyName="Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition="'$(MSBuildAssemblyVersion)' != ''" />

其他解决方法是删除在GenerateBindingRedirects内部声明的元素PostSharp.targets(将此文件添加到git跟踪的文件中),或在项目的.csproj文件中添加该元素的替代项,其中有问题(类似这样):

<Target Name="PostSharpGenerateBindingRedirects" DependsOnTargets="ResolveAssemblyReferences" Inputs="$(MSBuildAllProjects);@(AppConfigFile);$(ResolveAssemblyReferencesStateFile);$(IntermediateOutputPath)" Outputs="$(_DefaultPostSharpHostConfigurationFile)" />

答案 1 :(得分:0)

我们只是遇到了同样的情况。从PostSharp 2升级到6.0.33。 构建发布配置时,我们的Jenkins构建失败,并出现相同的错误。

@Mauro Picotti的建议很有帮助,但是安装Microsoft.Build.Tasks.Core软件包对我们而言也不起作用,因为它需要.NET 4.5+,而我们的目标是.NET 4.0。 其他建议只是禁用绑定重定向,这很危险,正如Mauro所说。这可能会导致很难诊断编译错误。

最终对我们有用的是告诉Jenkins使用新版本的MS Build。而不是MS Build 4.0,我们从VS 2013或VS 2017调用MS Build,它似乎具有GenerateBindingRedirects任务可用并且构建良好。