Вопрос

Я заинтересован в небольшой генерации кода на основе определенных файлов, присутствующих в .csproj.Какие методы расширения доступны мне, чтобы я мог сгенерировать файл .cs, который был бы скомпилирован вместе с моим проектом?

Предостережение:Я сразу же подумал об использовании шаблонов T4 для этой задачи.Однако это решение должен должен поддерживаться в Visual Studio C # Express.Я считаю, что версия Express не поддерживает шаблоны T4

Это было полезно?

Решение

В C # Express ответ прост:Нет.

C # Экспресс не поддерживает расширения.Люди пробовали это раньше, и получилось некрасиво.Адвокаты, бардак, все такое.Известным примером является TestDriven.NET.

Если вы не возражаете против сборки в командной строке, вы могли бы использовать пользовательскую задачу msbuild или команду до сборки / после сборки.

В VS2005 / VS2008 ("правильный") "пользовательский инструмент" - это тот самый один из способов пойти;это включает в себя написание Package; Я сделал это недавно, и код открыт для осмотра.

T4 - это еще один вариант на будущее.Это не соответствовало моим потребностям, но могло бы подойти вашим.


В качестве быстрой проверки событий сборки я добавил (в экспресс-проект) события до сборки и после сборки (Свойства проекта -> События сборки):

echo $(TargetPath)

и

echo $(SolutionDir)

соответственно;нажмите "построить", и результат будет готов:

------ Build started: Project: ConsoleApplication10, Configuration: Release Any CPU ------
echo D:\SomePath\ConsoleApplication10.exe
D:\SomePath\ConsoleApplication10.exe
c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /unsafe+ /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:TRACE /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug:pdbonly /filealign:512 /optimize+ /out:obj\Release\ConsoleApplication10.exe /target:exe Form1.cs Form1.Designer.cs Form2.cs Form2.Designer.cs Program.cs Properties\AssemblyInfo.cs

Compile complete -- 0 errors, 0 warnings
ConsoleApplication10 -> D:\SomePath\ConsoleApplication10.exe
echo D:\SomePath
D:\SomePath
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Так что, кажется, все работает нормально (т. е.оба события были выполнены).Не элегантно, но выполнимо.Макросы должны позволять вам (с некоторыми настройками) получать доступ к элементам проекта, например $(ProjectPath)SomeFile.xml

Другие советы

Вы можете открыть файл csproj (это всего лишь сценарий msbuild) и добавить собственные цели.

Есть две цели по умолчанию, которые вы можете переопределить для этой цели: BeforeBuild и AfterBuild (может быть, больше, но я не уверен в других).

Вы также можете включать настраиваемые библиотеки DLL в новые задачи msbuild, хотя это приведет к появлению предупреждения безопасности при открытии проекта, если вы не добавите библиотеку DLL в список безопасных импортов msbuild (HKLM \ Software \ Microsoft \ Visual Studio \ 9.0 \ MSBuild \ SafeImports) , 8.0, если вы используете VS2005.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top