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 перезаписывается во время отладки, и в противном случае вы можете преобразовать не тот файл.