我有一个控制台应用程序,它引用了解决方案中的其他项目。当我构建它时,它将在Debug中复制这些dll。我想在exe中导入它们。如果我将它们添加到资源然后从那里加载,它们不会更新。我丢失了引用的DLL的更改。有没有办法可以构建它们并将它们导入到每个构建的可执行文件中?
答案 0 :(得分:4)
您可以使用ILMerge将多个程序集合并为一个。
答案 1 :(得分:0)
杰弗里里希特有一篇关于这个主题的文章:
关键是
对于您添加的每个DLL文件,显示其属性并将其构建操作更改为嵌入式资源。
答案 2 :(得分:0)
这是适用于我的解决方案:
它在每次构建之后使用ILMerge合并程序集(如注释中建议的那样)。我需要为.NET Framework 4更新.targets文件。如果有人需要它:
<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
之类的地方。在post-build事件命令行中编写命令。
$(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
构建之后,您将获得带有嵌入式DLL的.exe,您可以单独运行它。