Лучший способ развернуть файл XSLT и сослаться на него

В проекте визуальной студии у меня есть три уровня: уровень данных, бизнес-уровень и уровень представления.

На уровне данных у меня есть несколько XSLT, которые преобразуют некоторые объекты в электронную почту, все работает нормально, но я обнаружил, что XSLT не создаются/не копируются при построении.

В настоящее время я создал папку в месте развертывания и поместил туда XSLT, но я беспокоюсь о том, чтобы полагаться на ручной процесс для их обновления.

Кто-нибудь сталкивался с подобной проблемой и если да, то как ее обойти.

Попахивает изменением скрипта MSBuild для копирования артефактов сборки в нужное место, у кого-нибудь есть примеры этого?

Такс


person Dean    schedule 03.11.2008    source источник


Ответы (4)


Если вы используете Visual Studio 2005/2008, проще всего это сделать, включив XSLT-файлы в качестве ресурсов проекта.

  1. Откройте свойства вашего проекта.
  2. Выберите вкладку Ресурсы. Вероятно, вы увидите ссылку «Этот проект не содержит файла ресурсов по умолчанию. Щелкните здесь, чтобы создать его». Нажмите на это.
  3. Щелкните раскрывающийся список «Добавить ресурс» вверху и выберите «Добавить существующий файл».
  4. Найдите файлы XSLT и выберите их.

После этого вы можете легко получить доступ к ресурсам следующим образом:

// To get the contents of the resource as a string:
string xslt = global::MyNamespace.Properties.Resources.MyXsltFile;
// To get a Stream containing the resource:
Stream xsltStream = global::MyNamespace.Properties.Resources.ResourceManager.GetStream("MyXsltFile");


Если вы используете Visual Studio 2003, лучше всего включить эти файлы XSLT в качестве встроенных ресурсов для библиотеки DLL. В Visual Studio выберите файлы в обозревателе решений, откройте панель свойств и измените тип сборки на «Встроенный ресурс». Затем вы можете использовать метод GetManifestResourceStream для получить поток, содержащий XSLT. Имя для передачи будет основано на пространстве имен вашей сборки по умолчанию, папке, содержащей файл, и имени файла.

Например, предположим, что ваша сборка уровня данных имеет пространство имен по умолчанию My.DataLayer. В вашем проекте уровня данных у вас есть папка с именем Templates, которая содержит файл Transform.xslt. Код для получения XSLT будет выглядеть так:

// There are numerous ways to get a reference to the Assembly ... this way works
// when called from a class that is in your data layer.  Have a look also at the
// static methods available on the Assembly class.
System.Reflection.Assembly assembly = (GetType()).Assembly;
System.IO.Stream xsltStream = assembly.GetManifestResourceStream("My.DataLayer.Templates.Transform.xslt");

Для получения дополнительной информации ознакомьтесь с этой статьей на CodeProject.

person jon without an h    schedule 03.11.2008
comment
Просто отметим, что в 2005 году, следуя точной процедуре здесь, чтобы получить ресурс в виде потока, я получаю System.InvalidOperationException : Resource 'xxx' не был потоком - вместо этого вызовите GetObject. - person tjmoore; 29.07.2010

Может быть, очевидный вопрос, но все же его нужно задать: вы включили папку, содержащую XSLT, в сам проект? Это веб-приложение или приложение для форм?

person Kev    schedule 03.11.2008

В VS легко установить свойства файлов XSLT в проекте для копирования при сборке, по умолчанию они этого не делают.

person kenny    schedule 03.11.2008

Я, возможно, плохо объяснил.

Уровень данных — это библиотека классов, на которую ссылается уровень представления.

При построении DataLayer я могу получить XSLT для вывода в каталог Bin DataLayer. Однако, когда я создаю и публикую уровень представления, он правильно захватывает DLL, но не XSLT.

person Dean    schedule 03.11.2008