Visual Studio (2010-2019) , к сожалению, не поддерживает его напрямую во время отладки, он предназначен только для публикации - даже с расширением SlowCheetah (отмечен ответ) он не работает для меня (только для проектов, использующих app.config, а не web.config).
Обратите внимание, что в codeproject есть обходной путь .
В нем описывается, как изменить файл .msproj, чтобы заменить текущий файл web.config преобразованной версией.
Сначала я опишу этот обходной путь как вариант 1 , но недавно я обнаружил еще один вариант 2 , который проще в использовании (так что вы можете прокрутить вниз до варианта 2, если хотите):
Вариант 1: Я добавил инструкции, взятые из исходной статьи codeproject (см. Ссылку выше), потому что снимки экрана там уже исчезли, и я не хочу терять всю информацию:
VS.Net не выполняет никаких преобразований, когда вы разрабатываете и просто отлаживаете локальную среду. Но есть несколько шагов, которые вы можете сделать, чтобы это произошло, если хотите.
- Во-первых, создайте в VS.Net нужные конфигурации , предполагая, что отладки и выпуска по умолчанию недостаточно для того, что вы пытаетесь выполнить.
- Щелкните правой кнопкой мыши
web.config
и выберите « Добавить преобразования конфигурации» - это создаст зависимую конфигурацию преобразования для каждой из заданных вами конфигураций.
- Теперь вы можете переименовать свой
web.config
в web.base.config
.
- Добавьте
web.config
в свой проект. Это не имеет значения , что в нем , потому что он будет перезаписан каждый раз , когда мы делаем сборку , но мы хотим , чтобы это часть проекта так VS.Net не дают нам «Ваш проект не настроен для отладки» поп- вверх.
- Отредактируйте файл
.csproj
проекта и добавьте следующую TransformXml
задачу в цель AfterBuild. Здесь вы можете видеть, что я буду преобразовывать web.base.config
файл с помощью, web.[configuration].config
и он сохранит его как web.config
. Для получения подробной информации, пожалуйста, проверьте эти вопросы и ответы Microsoft, а инструкции по расширению сборки смотрите там .
Вариант 2:
На основе этого ответа я разработал простое консольное приложение TransformConfig.exe (в синтаксисе C # 6.0):
using System;
using System.Linq;
using Microsoft.Web.XmlTransform;
namespace TransformConfig
{
class Program
{
static int Main(string[] args)
{
var myDocumentsFolder = $@"C:\Users\{Environment.UserName}\Documents";
var myVsProjects = $@"{myDocumentsFolder}\Visual Studio 2015\Projects";
string srcConfigFileName = "Web.config";
string tgtConfigFileName = srcConfigFileName;
string transformFileName = "Web.Debug.config";
string basePath = myVsProjects + @"\";
try
{
var numArgs = args?.Count() ?? 0;
if (numArgs == 0 || args.Any(x=>x=="/?"))
{
Console.WriteLine("\nTransformConfig - Usage:");
Console.WriteLine("\tTransformConfig.exe /d:tgtConfigFileName [/t:transformFileName [/s:srcConfigFileName][/b:basePath]]");
Console.WriteLine($"\nIf 'basePath' is just a directory name, '{basePath}' is preceeded.");
Console.WriteLine("\nTransformConfig - Example (inside PostBuild event):");
Console.WriteLine("\t\"c:\\Tools\\TransformConfig.exe\" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:\"$(ProjectDir)\\\"");
Environment.ExitCode = 1;
return 1;
}
foreach (var a in args)
{
var param = a.Trim().Substring(3).TrimStart();
switch (a.TrimStart().Substring(0,2).ToLowerInvariant())
{
case "/d":
tgtConfigFileName = param ?? tgtConfigFileName;
break;
case "/t":
transformFileName = param ?? transformFileName;
break;
case "/b":
var isPath = (param ?? "").Contains("\\");
basePath = (isPath == false)
? $@"{myVsProjects}\" + param ?? ""
: param;
break;
case "/s":
srcConfigFileName = param ?? srcConfigFileName;
break;
default:
break;
}
}
basePath = System.IO.Path.GetFullPath(basePath);
if (!basePath.EndsWith("\\")) basePath += "\\";
if (tgtConfigFileName != srcConfigFileName)
{
System.IO.File.Copy(basePath + srcConfigFileName,
basePath + tgtConfigFileName, true);
}
TransformConfig(basePath + tgtConfigFileName, basePath + transformFileName);
Console.WriteLine($"TransformConfig - transformed '{basePath + tgtConfigFileName}' successfully using '{transformFileName}'.");
Environment.ExitCode = 0;
return 0;
}
catch (Exception ex)
{
var msg = $"{ex.Message}\nParameters:\n/d:{tgtConfigFileName}\n/t:{transformFileName}\n/s:{srcConfigFileName}\n/b:{basePath}";
Console.WriteLine($"TransformConfig - Exception occurred: {msg}");
Console.WriteLine($"TransformConfig - Processing aborted.");
Environment.ExitCode = 2;
return 2;
}
}
public static void TransformConfig(string configFileName, string transformFileName)
{
var document = new XmlTransformableDocument();
document.PreserveWhitespace = true;
document.Load(configFileName);
var transformation = new XmlTransformation(transformFileName);
if (!transformation.Apply(document))
{
throw new Exception("Transformation Failed");
}
document.Save(configFileName);
}
}
}
Убедитесь, что вы добавляете DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
в качестве ссылки (этот пример относится к VS 2015, для более старых версий замените v14.0
в пути на соответствующий номер версии, например v11.0
).
Для Visual Studio 2017, схема присвоения имен пути изменилось: например, для корпоративной версии именно здесь: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Предполагаю, что для профессиональной версии нужно Enterprise
в пути заменить на Professional
. Если вы используете предварительную версию, дополнительно замените 2017
на Preview
.
Вот обзор того, как путь изменился для разных версий Visual Studio (если у вас нет версии Enterprise, вам может потребоваться заменить Enterprise
на Professional
в пути):
Путь к Microsoft.Web.XmlTransform.dll
версии VS (для )
2015 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web
2017 C:\Program Files (x86)\Microsoft Visual Studio\2017\
Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
2019 C:\Program Files (x86)\Microsoft Visual Studio\2019\
Enterprise\MSBuild\Microsoft\VisualStudio\v16.0\Web
Скомпилируйте его и поместите файл .exe в каталог, например C:\MyTools\
.
Использование:
вы можете использовать его в своем событии после сборки (в свойствах проекта выберите Build Events , затем отредактируйте командную строку Post-build event ). Параметры командной строки (пример):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
т.е. сначала имя файла конфигурации, затем файл конфигурации преобразования, затем необязательный шаблон конфигурации, а затем путь к вашему проекту, содержащему оба файла.
Я добавил необязательный параметр конфигурации шаблона, потому что в противном случае исходная полная конфигурация будет перезаписана преобразованием, чего можно избежать, предоставив шаблон.
Создайте шаблон, просто скопировав исходный Web.config и назовите его Web.Template.config.
Заметка:
Если вы предпочитаете, вы также можете скопировать TransformConfig.exe
файл по указанному выше пути Visual Studio, где он Microsoft.Web.XmlTransform.dll
находится, и ссылаться на него во всех своих проектах, где вам нужно преобразовать свои конфигурации.
Для тех из вас, кому интересно, почему я добавил Environment.ExitCode = x;
назначения: простой возврат int из Main не помог в событии сборки. Подробности здесь.
Если вы публикуете свой проект и используете Web.Template.config, перед публикацией убедитесь, что вы выполнили перестройку своего решения с правильной конфигурацией (обычно Release). Причина в том, что Web.Config перезаписывается во время отладки, и в противном случае вы можете преобразовать не тот файл.