Подтвердить что ты не робот

Visual Studio один проект с несколькими DLL в качестве вывода?

Я программирую проект с поддержкой плагина. Поскольку многие из плагинов относительно малы (только один источник файл/класс), я бы хотел, чтобы все они были в одном проекте в visual studio, но для успешного выполнения этого мне понадобился бы каждый исходный файл/класс, который должен быть скомпилирован в его собственный DLL файл, возможно ли это с помощью visual studio?

Если это невозможно с визуальной студией, можно ли использовать другую систему сборки, все еще кодируя и отлаживая визуальную студию?

В настоящее время я установил тип вывода проекта плагинов на консоль и запрограммировал метод main(), который скомпилирует все файлы .cs в исходном каталоге в dll и скопирует их в соответствующий каталог. Затем я установил это консольное приложение как событие после сборки проекта плагинов. Он работает, но кажется очень уродливым взломом.

Использование Visual Studio 2010.

4b9b3361

Ответ 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.