Я хочу отправить одну сборку .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.