Немного хака, который, как мне показалось, работает, в основном дает вашей задаче префикс пространства имен.
[TaskName("zz:msbuild")]
public class MsbuildTask : ExternalProgramBase
{
}
Тогда в вашем файле сборки nant:
<project default="Build" name="TestBuild"
xmlns="http://nant.sf.net/schemas/nant-0.85.win32.net-1.0.xsd"
xmlns:zz="http://nant.sf.net/schemas/nant-0.85.win32.net-1.0.xsd">
<target name="Build">
<zz:msbuild target="Build" project="TestBuild.sln"
verbosity="${msbuild.verbosity}">
<property name="Configuration" value="${build.configuration}" />
</zz:msbuild>
</target>
</project>
Единственное, что мне не нравится, это то, что мне нужно встроить префикс в TaskNameAttribute. Это необходимо, потому что внутренне NAnt использует строку "zz: msbuild" для хэширования задачи и выполняет поиск на основе свойства XmlNode.Name.
Также обратите внимание, что префикс указывает на пространство имен по умолчанию. Это связано с тем, что NAnt отбрасывает узлы с пространствами имен, отличными от пространства имен NAnt по умолчанию. Я могу понять, почему они это сделали, но я не знаю, что это абсолютно необходимо.
Глядя на источник NAnt, кажется очень целесообразным внести коррективы, чтобы мне не нужно было вставлять префикс и назначать заданию другое пространство имен.
Альтернативой этому подходу, который я использовал ранее, было использование имени задачи, например "zz.msbuild". Но это действительно не казалось правильным. Я помню, что читать где-то с точкой в именах элементов не рекомендуется. Но более того, это не выглядело хорошо: P