Visual Studio один проект с несколькими DLL в качестве вывода?
Я программирую проект с поддержкой плагина.
Поскольку многие из плагинов относительно малы (только один источник файл/класс), я бы хотел, чтобы все они были в одном проекте в visual studio, но для успешного выполнения этого мне понадобился бы каждый исходный файл/класс, который должен быть скомпилирован в его собственный DLL файл, возможно ли это с помощью visual studio?
Если это невозможно с визуальной студией, можно ли использовать другую систему сборки, все еще кодируя и отлаживая визуальную студию?
В настоящее время я установил тип вывода проекта плагинов на консоль и запрограммировал метод main(), который скомпилирует все файлы .cs в исходном каталоге в dll и скопирует их в соответствующий каталог. Затем я установил это консольное приложение как событие после сборки проекта плагинов. Он работает, но кажется очень уродливым взломом.
Использование Visual Studio 2010.
Ответы
Ответ 1
Вы можете создать один проект для каждого плагина и сгруппировать все проекты в решении.
Если вы не хотите иметь один проект для каждого плагина, вы можете создать собственную сборку с помощью MSBuild с помощью Задача CSC
Как сгенерировать dll для каждого файла плагина
- В проекте вы добавляете все файлы плагинов
-
Отредактируйте файл проекта, чтобы указать, какой класс будет генерировать библиотеку плагинов:
<ItemGroup>
<Compile Include="Class1.cs">
<Plugin>true</Plugin>
</Compile>
<Compile Include="Class2.cs" />
<Compile Include="Class3.cs">
<Plugin>true</Plugin>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
-
Добавить новую цель в файл проекта для создания библиотеки плагинов
<Target Name="BuildPlugins">
<CSC Condition="%(Compile.Plugin) == 'true'"
Sources="%(Compile.FullPath)"
TargetType="library"
OutputAssembly="$(OutputPath)%(Compile.FileName).dll"
EmitDebugInformation="true" />
</Target>
-
Если вы хотите создать библиотеку плагинов после каждой сборки, добавьте цель после сборки:
<Target Name="AfterBuild" DependsOnTargets="BuildPlugins">
</Target>
Ответ 2
Вам просто нужно создать Solution
, а затем добавить столько проектов, которые вы хотите.
Вы можете иметь 5 проектов Class Library
и скомпилировать их, генерируя 5 DLL.
Ответ 3
Чтобы рассказать о решении Julien Hoarau выше, вот решение, которое позволяет вам скомпилировать несколько DLL файлов из одного проекта и скомпилировать эти файлы DLL из нескольких файлов CS. Просто откройте файл csproj и добавьте его перед </Project> тег:
<!-- Plugin Building -->
<!-- 1. Hardlink to NuGet References - CSC does not read HintPaths, so you will have to create these for all your packages -->
<ItemGroup>
<PluginReference Include="..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll" ><InProject>false</InProject></PluginReference>
<PluginReference Include="..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll" ><InProject>false</InProject></PluginReference>
<PluginReference Include="..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll" ><InProject>false</InProject></PluginReference>
<PluginReference Include="..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll" ><InProject>false</InProject></PluginReference>
<PluginReference Include="..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll" ><InProject>false</InProject></PluginReference>
</ItemGroup>
<!-- 2. Each Plugin CS Files -->
<!-- You see that each tag in here has it own name starting with Plugin -->
<!-- We can reference that later e.g. as @(PluginBlue) to get an array list to pass to the CSC sources, allowing us to have multiple files -->
<!-- Plugin.Blue\**\*.cs gets all the files in the "Plugin.Blue" folder -->
<!-- Plugin.Green just has a specific file list -->
<ItemGroup>
<PluginBlue Include="Plugin.Blue\**\*.cs"><InProject>false</InProject></PluginBlue>
<PluginGreen Include="Plugin.Green\File1.cs"><InProject>false</InProject></PluginGreen>
<PluginGreen Include="Plugin.Green\File2.cs"><InProject>false</InProject></PluginGreen>
</ItemGroup>
<!-- 3. Build each Plugin -->
<Target Name="BuildPlugins">
<!-- Plugin Blue -->
<CSC Sources="@(PluginBlue)" References="@(PluginReference)" TargetType="library" OutputAssembly="$(OutputPath)Plugin.Blue.dll" EmitDebugInformation="true" />
<!-- Plugin Green -->
<CSC Sources="@(PluginGreen)" References="@(PluginReference)" TargetType="library" OutputAssembly="$(OutputPath)Plugin.Green.dll" EmitDebugInformation="true" />
</Target>
<!-- 4. Require Build on Solution Compile -->
<Target Name="AfterBuild" DependsOnTargets="BuildPlugins">
</Target>
Это мой подход - он позволяет вам держать все организованное внизу, а не распространяться по всему файлу проекта. Используя
<InProject>false</InProject>
позволяет нам скрыть файлы из SolutionExplorer и иметь отдельный определенный список файлов вместо простого добавления тега плагина в нужные нам файлы. В своем основном решении не забудьте установить для "Build Action" значение "none" для всех файлов, которые вы компилируете в плагине, чтобы дублирования в основном файле проекта не было.
Подробнее о CSC:
https://msdn.microsoft.com/en-us/library/78f4aasd.aspx Создание командной строки с помощью csc.exe
https://msdn.microsoft.com/en-us/library/ms379563(v=vs.80).aspx Работа с компилятором командной строки С# 2.0
https://msdn.microsoft.com/en-us/library/s5c8athz.aspx Задача Csc
https://msdn.microsoft.com/en-us/library/7szfhaft.aspx Условия MSBuild
Я надеюсь, что это кому-то полезно.
Ответ 4
Если вы хотите, чтобы каждый файл кода был собственной DLL, вам нужно создать новый проект для каждого файла кода. Но вы можете поместить несколько файлов проекта (.csproj) в одно большое решение.
Если это вас не устраивает, вы всегда можете скомпилировать свой проект с помощью командной строки. Это позволит вам настроить свою сборку в соответствии с вашими потребностями. Например, вы можете написать пакетный скрипт или файл powershell script, который бы скомпилировал все ваши файлы кода в отдельную DLL.