如何将MSB3245(无法parsing引用)警告视为错误?

我的问题是基于另一个 ,但我想做相反的 :告诉msbuild将该警告视为错误,而不是压制一个特定的msbuild警告。

不过,到目前为止,我所看到的只有/p:WarningsAsErrors只能用于csc警告和错误。 我尝试着丢掉MSB然后用Googlesearch哪些数字可以在那里工作,但没有运气。

有没有办法将msbuild(命令行)的“assembly reference not found”警告视为错误?

最近我需要类似的东西(在某些日志事件上作用),但我找不到干净的解决scheme,主要是因为我没有想到如何以编程方式访问msbuild进程中的logging器。 我确实想出了这个,适应你的问题的原则是:

  • 安装自定义logging器扫描警告
  • build立
  • 如果发生警告,则设置一个静态标志
  • 有一个自定义任务检查该标志,并提出一个错误,如果它打开

听起来很难,但代码很简单:

 using Microsoft.Build.Framework; using Microsoft.Build.Utilities; namespace Foo { public static class Common { public static bool errorsOccurred = false; } public class ScanLogger : Logger { public override void Initialize( IEventSource eventSource ) { eventSource.MessageRaised += ( s, e ) => Common.errorsOccurred |= e.Message.Contains( "MSB3245" ); } } public class CheckErrors : Task { public override bool Execute() { if( Common.errorsOccurred == false ) return true; Log.LogError( "errorsOccurred = true" ); return false; } } } 

这是一个使用它的示例msbuild脚本:

 <UsingTask TaskName="Foo.CheckErrors" AssemblyFile="Foo.dll"/> <Target Name="MyBuild"> <Message Text="MSB3245"/> <!-- simulate the build warning --> <Foo.CheckErrors /> <!-- this will trigger an error --> </Target> 

你像这样调用它:

 msbuild /logger:Foo.dll my.proj 

编辑我只是需要这一次,但无法find原来的DLL或项目文件等了 – 我想存储只是代码和最简单的编译指令,并build立它在飞行时需要它可能更干净。 因此,基本上将上面的代码存储在一个文件customlogger.cs中,然后在构build过程中的某个地方,在使用自定义logging器有效调用msbuild之前,使用

 <Target Name="BuildCustomLoggerDll"> <Csc Sources="$(MSBuildThisFileDirectory)customlogger.cs" References="System.dll;mscorlib.dll;Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.v4.0.dll" TargetType="Library" OutputAssembly="$(MSBuildThisFileDirectory)CustomLogger.dll"/> </Target> 

看来与这个警告相关的消息不是一个警告:

如果您的代码需要此引用,则可能会出现编译错误

,是不是很正确。 如果缺less的引用是一个WPF主题,您将得到一个运行时错误(System.IO.FileNotFoundException)。

另外,如果你专门寻找MSB3245,你会得到:

CSC:警告CS1691:“MSB3245”不是有效的警告号码