Вот решение, которое сработало для меня:
http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx
Он объединяет сборки после каждой сборки с ILMerge (как предложено в комментариях). Мне нужно было обновить файл .targets для .NET Framework 4. На случай, если это кому-нибудь понадобится:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<CreateItem Include="@(ReferencePath)" Condition="'%(CopyLocal)'=='true' and '%(ReferencePath.IlMerge)'=='true'">
<Output TaskParameter="Include" ItemName="IlmergeAssemblies"/>
</CreateItem>
<Message Text="MERGING: @(IlmergeAssemblies->'%(Filename)')" Importance="High" />
<Exec Command=""$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe" /out:@(MainAssembly) "@(IntermediateAssembly)" @(IlmergeAssemblies->'"%(FullPath)"', ' ') /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards" />
</Target>
<Target Name="_CopyFilesMarkedCopyLocal"/>
</Project>
Обновление
Хотя вышеприведенное решение работает, вы можете упростить его, и вам не понадобятся целевые файлы. Вы можете поместить ILMerge где-нибудь в решении. Затем позвоните оттуда после сборки. ILMerge.exe - это все, что вам нужно, скопируйте его куда-нибудь, например /solutionDirectory/Tools
. Напишите команду в командной строке события после сборки.
$(SolutionDir)Tools\ILMerge.exe /out:"$(ProjectDir)bin\Debug\WindowsGUI.exe" "$(ProjectDir)obj\x86\Debug\WindowsGUI.exe" "$(SolutionDir)BusinessLayer\bin\Debug\BusinessLayer.dll" /target:exe /targetplatform:v4,"$(MSBuildBinPath)" /wildcards
После сборки вы получаете .exe со встроенными DLL и можете запускать его самостоятельно.