Связывание сетевых модулей с одним файлом в msbuild - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу отправить одну сборку .NET, сгенерированную из нескольких проектов C #, через .netmodules.

Я экспериментировал с ILmerge, но у него есть другие проблемы.Я также взглянул на способ AssemblyResolve, но я не совсем понимаю его (оба рассматриваются здесь: Как объединить несколько сборок в одну? ).

Я нашелвозможное решение, которое будет хорошо работать для этой задачи с помощью .netmodules.Никаких внешних программ, стандартных инструментов, результирующая сборка выглядит так, как будто она пришла только из одного проекта (в ildasm).

Вот MWE: Lib.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OutputType>Module</OutputType>
    <OutputPath>bin\</OutputPath>
    ...
  </PropertyGroup>
  ...
  <ItemGroup>
    <Compile Include="Lib.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Exe.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OutputType>Module</OutputType>
    <OutputPath>bin\</OutputPath>
    ...
  </PropertyGroup>
  ...
  <ItemGroup>
    <AddModules Include="..\Lib\bin\Lib.netmodule" />
    <Compile Include="Program.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Тип вывода для обоих проектов установлен на модуль.Проект "Exe" использует сетевой модуль "Lib" через переключатель AddModules (необходим для компиляции).В результате получается два .net-модуля в выходном каталоге Exe.

На последнем шаге компоновщик используется для соединения всех .net-модулей в одну сборку (см. https://docs.microsoft.com/en-us/cpp/build/reference/netmodule-files-as-linker-input?view=vs-2017):

link Lib.netmodule Exe.netmodule -subsystem:console -out:Exe.exe -ltcg -entry:Exe.Program.Main

.вопрос: может ли этот последний шаг выполнить MSBuild? Также было бы полезно решение CMake, но я не смог получить тип вывода "Module" из CMake.

...