Чтобы расширить ответ Джулиена Хорау выше, вот решение, которое позволяет вам скомпилировать несколько файлов DLL в рамках одного проекта, и эти файлы DLL должны быть скомпилированы из нескольких файлов CS. Просто откройте файл csproj и добавьте его перед тегом :
<!-- 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's 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 и иметь отдельный определенный список файлов вместо простого добавления тега плагина к нужным файлам. В вашем основном решении обязательно установите для параметра «Действие сборки» значение «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 Работа с компилятором командной строки C # 2.0
https://msdn.microsoft.com/en-us/library/s5c8athz.aspx Csc Task
https://msdn.microsoft.com/en-us/library/7szfhaft.aspx MSBuild Условия
Надеюсь, это кому-нибудь пригодится.