EntryPointNotFoundException при попытке использовать TransformXml в пользовательской операции сборки
В процессе настройки TFS 2013 для создания и развертывания сайтов и сервисов для разработки и тестирования систем я натолкнулся на ответ Stackru для создания настраиваемой операции сборки для преобразования файлов Web.config. Я добавил его в шаблон процесса сборки, и TFS вызывает его во время процесса сборки / развертывания, хотя при вызове translation.Execute() я получаю
Необработанное исключение типа "System.EntryPointNotFoundException" произошло в Microsoft.Build.Utilities.v4.0.dll
Дополнительная информация: Точка входа не найдена.
Я создал быстрое консольное приложение для непосредственного вызова пользовательского действия, и на моем локальном компьютере также выдается то же исключение.
Для справки вот пользовательская сборка из ответа, который я привел выше
/// <summary>
/// Transforms configuration files using TransformXml
/// </summary>
[BuildActivity(HostEnvironmentOption.All)]
public sealed class WebConfigTransform : CodeActivity
{
#region Public Properties
/// <summary>
/// The binaries folder
/// </summary>
[RequiredArgument]
public InArgument<string> BinariesLocation { get; set; }
#endregion
#region Overrides of CodeActivity
/// <summary>
/// When implemented in a derived class, performs the execution of the activity.
/// </summary>
/// <param name="context">The execution context under which the activity executes.</param>
protected override void Execute(CodeActivityContext context)
{
var binariesFolder = context.GetValue(BinariesLocation);
foreach (var sourceFolder in Directory.GetDirectories(Path.Combine(binariesFolder, "_PublishedWebsites")))
{
var sourceFile = Path.Combine(sourceFolder, "Web.config");
if (File.Exists(sourceFile))
{
var filesToTransform = Directory.GetFiles(sourceFolder, "Web.*.config");
foreach (var fileToTransform in filesToTransform)
{
var tempSourceFile = Path.GetTempFileName();
var tempTransformFile = Path.GetTempFileName();
File.Copy(sourceFile, tempSourceFile, true);
File.Copy(fileToTransform, tempTransformFile, true);
var transformation = new TransformXml
{
BuildEngine = new BuildEngineStub(),
Source = tempSourceFile,
Transform = tempTransformFile,
Destination = fileToTransform
};
transformation.Execute();
}
}
}
}
#endregion
}
public class BuildEngineStub : IBuildEngine
{
#region IBuildEngine Members
public bool BuildProjectFile(string projectFileName, string[] targetNames,
IDictionary globalProperties,
IDictionary targetOutputs)
{
throw new NotImplementedException();
}
public int ColumnNumberOfTaskNode
{
get { return 0; }
}
public bool ContinueOnError
{
get { return false; }
}
public int LineNumberOfTaskNode
{
get { return 0; }
}
public string ProjectFileOfTaskNode
{
get { return ""; }
}
public void LogCustomEvent(CustomBuildEventArgs e)
{
Console.WriteLine("Custom: {0}", e.Message);
}
public void LogErrorEvent(BuildErrorEventArgs e)
{
Console.WriteLine("Error: {0}", e.Message);
}
public void LogMessageEvent(BuildMessageEventArgs e)
{
Console.WriteLine("Message: {0}", e.Message);
}
public void LogWarningEvent(BuildWarningEventArgs e)
{
Console.WriteLine("Warning: {0}", e.Message);
}
#endregion
}
1 ответ
Кажется, у меня были ссылки на неправильные версии DLL, которые мне были нужны; он скомпилирован просто отлично, но не будет работать правильно.
Вместо поиска в C:\, чтобы найти необходимые библиотеки, как было предложено на другом сайте, я нашел четыре сборки Microsoft, которые мне были нужны, в Reference Manager > Сборки> Framework
Microsoft.Build.Framework
Microsoft.Build.Utilities.v4.0
Microsoft.TeamFoundation.Build.Client
Microsoft.TeamFoundation.Build.Workflow
Это привело к решению моей проблемы, и файл конфигурации теперь преобразуется по мере необходимости