Как добавить исходный файл (.cs) к ресурсам (.resx) в событии перед сборкой?

Это просто или даже возможно?

Почему: следуя моему другой вопрос и используя этот подход, теперь я хотел бы просто встроить исходный файл в ресурсы, чтобы я мог скопировать его во временную папку во время работы приложения и сохранить приложение в виде одного файла.

Я предполагаю, что использование события предварительной сборки - лучший способ сделать это. Если да, то как это сделать?

EDIT: я спрашиваю о добавлении его перед сборкой, потому что я также предполагаю, что он не будет автоматически обновляться, если я добавлю его вручную один раз, а затем изменю код.


person mkvlrn    schedule 25.04.2012    source источник


Ответы (2)


Недавно я прошел через эту же проблему при разработке набора примеров для элемента управления .NET, который должен отображать собственный исходный код примера в приложении.

Подход, к которому я пришел, был следующим.

  1. Я создал пакетный скрипт (запущенный в предварительной сборке), чтобы скопировать все файлы кода в /Examples/* в другую папку в решении Resources/ExamplesSrc/*

  2. Затем я включил все эти файлы в Resources/ExamplesSrc/* в csproj и сохранил их.

  3. Следующим шагом было установить все файлы в папке Resources/ExamplesSrc/* как встроенный ресурс и зафиксировать изменение в SVN. Я не передал примеры (сгенерированные) в SVN, только модифицированный csproj и командный файл.

Эффект, когда разработчики выезжали, заключался в том, что у них были (!) иконки на всех ресурсах (их не было на диске, но csproj их искал), однако как только они собрали, сгенерированные файлы появились, и все было хорошо. Этот подход также работал с сервером сборки (Team city), и набор примеров теперь может загружать и просматривать собственный код с помощью встроенных ресурсов.

Одно предостережение, о котором вы должны знать. В VS2010 есть причуда (по-видимому, по дизайну). Если встроенный ресурс содержит «.cs» (то есть любой файл кода!), его нельзя загрузить из сборки с помощью Assembly.GetManifestResourceStream(). Чтобы обойти это, все исходные файлы были переименованы на этапе пакетного копирования с *.Xaml.cs на *.Xaml.c.txt, с *.cs на *.c.txt.

Надеюсь это поможет!

person Dr. Andrew Burnett-Thompson    schedule 25.04.2012
comment
О, я не использую контроль версий, это просто небольшое приложение для обучения/обучения, но я хочу отправить его моему профессору колледжа и однокурсникам, поэтому наличие готового кода — это плюс. Спасибо за предложение! - person mkvlrn; 26.04.2012
comment
Тогда вам нужно знать, что если вы ошибетесь с пакетным файлом, он исказит ваши исходные файлы. Убедитесь, что вы сделали резервную копию, прежде чем делать это! - person Dr. Andrew Burnett-Thompson; 26.04.2012

Оказывается, мне не нужно (повторно) добавлять исходный файл каждый раз, когда я создаю решение!

Когда я добавляю его вручную, он становится «текстовым» файлом в ресурсах, и я могу легко получить к нему доступ как строку, используя Properties.Resources.SourceCode (имея файл с именем «SourceCode.cs "). И да, он обновляется автоматически, так как свойство ресурса «Постоянство»: файл компонуется во время компиляции.

person mkvlrn    schedule 26.04.2012
comment
@ Dr.AndrewBurnett-Thompson Да, сработало нормально. Я даже пробовал с пустым файлом .cs, а затем начал кодировать его после создания ссылки на ресурс. Код был там во время выполнения, каждый раз. Конечно, вам нужно только сохранить файл кода. - person mkvlrn; 26.04.2012
comment
Хорошо, позвольте мне понять это прямо, у вас есть файл кода в Project/*, и вы добавляете тот же исходный файл к ресурсам resx, а затем можете получить доступ как строку? Фантастика. Я мог бы преобразовать свой код, который использует пакетные файлы :) Кстати, у меня есть silverlight, поэтому здесь может быть проблема, но стоит попробовать. Спасибо, что поделились своим обновленным ответом - person Dr. Andrew Burnett-Thompson; 26.04.2012
comment
@Dr.AndrewBurnett-Thompson Именно это я и сделал: просто добавил в ресурсы существующий файл *.cs (в папке моего проекта). Попробуйте, хотя я не уверен, что это сработает для проекта Silverlight. - person mkvlrn; 26.04.2012