Я не знаю причину вашей ошибки, но я получил именно эту ошибку, потому что у меня был итератор для вектора, затем я обновил вектор, затем я попытался разыменовать итератор (например, access * myIterator). Я новичок в C ++, но кажется, что если вы измените коллекцию после получения для нее итератора, ваш итератор больше не будет действительным. Вам нужно переназначить свой итератор туда, где он был.
AFAIK MSBuild не имеет никакой встроенной поддержки для получения количества предупреждения в данной точке сценария сборки. Можно однако выполнить эти шаги для достижения этой цели:
Самый трудный шаг является шагом 3. Для этого существует несколько опций, и можно свободно искать их под IPC - Процесс Интера Comunication. Следует рабочему примеру того, как можно достигнуть этого. Каждым объектом является различная Библиотека классов.
SharedMemory
http://weblogs.asp.net/rosherove/archive/2003/05/01/6295.aspx
Я создал обертку для именованной общей памяти, которая была частью большего проекта. Это в основном позволяет сериализированным типам и графам объектов быть сохраненными в и полученными от общей памяти (включая то, поскольку Вы ожидали бы перекрестный процесс). Завершается ли больший проект когда-нибудь, другой вопрос ;-).
SampleLogger
Реализует пользовательский регистратор, который отслеживает количество предупреждения.
namespace SampleLogger
{
using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using DM.SharedMemory;
public class MySimpleLogger : Logger
{
private Segment s;
private int warningCount;
public override void Initialize(IEventSource eventSource)
{
eventSource.WarningRaised += new BuildWarningEventHandler(eventSource_WarningRaised);
this.s = new Segment("MSBuildMetadata", SharedMemoryCreationFlag.Create, 65535);
this.s.SetData(this.warningCount.ToString());
}
void eventSource_WarningRaised(object sender, BuildWarningEventArgs e)
{
this.warningCount++;
this.s.SetData(this.warningCount.ToString());
}
public override void Shutdown()
{
this.s.Dispose();
base.Shutdown();
}
}
}
SampleTasks
Реализует пользовательскую задачу, которая читает количество предупреждений, повышенных в проекте MSbuild. Пользовательская задача читает из общей памяти, записанной пользовательским регистратором, реализованным в библиотеке классов SampleLogger.
namespace SampleTasks
{
using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using DM.SharedMemory;
public class BuildMetadata : Task
{
public int warningCount;
[Output]
public int WarningCount
{
get
{
Segment s = new Segment("MSBuildMetadata", SharedMemoryCreationFlag.Attach, 0);
int warningCount = Int32.Parse(s.GetData() as string);
return warningCount;
}
}
public override bool Execute()
{
return true;
}
}
}
Ехать прокатиться.
<?xml version="1.0" encoding="UTF-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Main">
<UsingTask TaskName="BuildMetadata" AssemblyFile="F:\temp\SampleLogger\bin\debug\SampleTasks.dll" />
<Target Name="Main">
<Warning Text="Sample warning #1" />
<Warning Text="Sample warning #2" />
<BuildMetadata>
<Output
TaskParameter="WarningCount"
PropertyName="WarningCount" />
</BuildMetadata>
<Error Text="A total of $(WarningCount) warning(s) were raised." Condition="$(WarningCount) > 0" />
</Target>
</Project>
Если Вы выполняете следующую команду:
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild test.xml /logger:SampleLogger.dll
Это будет выводом:
Microsoft (R) Build Engine Version 2.0.50727.3053
[Microsoft .NET Framework, Version 2.0.50727.3053]
Copyright (C) Microsoft Corporation 2005. All rights reserved.
Build started 30-09-2008 13:04:39.
__________________________________________________
Project "F:\temp\SampleLogger\bin\debug\test.xml" (default targets):
Target Main:
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #1
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #2
F:\temp\SampleLogger\bin\debug\test.xml(15,3): error : A total of 2 warning(s) were raised.
Done building target "Main" in project "test.xml" -- FAILED.
Done building project "test.xml" -- FAILED.
Build FAILED.
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #1
F:\temp\SampleLogger\bin\debug\test.xml : warning : Sample warning #2
F:\temp\SampleLogger\bin\debug\test.xml(15,3): error : A total of 2 warning(s) were raised.
2 Warning(s)
1 Error(s)
Time Elapsed 00:00:00.01
Компилятор C# (csc.exe) имеет желание переключателя/warnaserror, будет рассматривать предупреждения как ошибки и приводить сборку к сбою. Это также доступно как установка в .csproj файле. Я предполагаю, что Delphi имеет подобную способность.
msbuild.exe %~nx1 /t:Rebuild /p:Configuration=Release >> %MrB-BUILDLOG%
findstr /r /c:"[1-9][0-9]* Error(s)" >> %MrB-BUILDLOG%
if not errorlevel 1 (
echo ERROR: sending notification email for build errors in '%~nx1'. >> %MrB-BUILDLOG%
) else (
findstr /r /c:"[1-9][0-9]* Warning(s)" >> %MrB-BUILDLOG%
if not errorlevel 1 (
echo ERROR: sending notification email for build warnings in '%~nx1'. >>
% %MrB-BUILDLOG) еще (повторяют Успешную сборку '% ~nx1'.>> %MrB-BUILDLOG %))