【发布时间】:2011-09-21 13:49:34
【问题描述】:
我有一个控制台应用程序正在引用解决方案中的其他项目。当我构建它时,它将在调试中复制这些 dll。我想在exe中导入它们。如果我将它们添加到资源然后从那里加载,它们不会更新。我丢失了对引用的 DLL 的更改。有没有一种方法可以构建它们并将它们导入到每个构建的可执行文件中?
【问题讨论】:
标签: .net visual-studio assemblies
我有一个控制台应用程序正在引用解决方案中的其他项目。当我构建它时,它将在调试中复制这些 dll。我想在exe中导入它们。如果我将它们添加到资源然后从那里加载,它们不会更新。我丢失了对引用的 DLL 的更改。有没有一种方法可以构建它们并将它们导入到每个构建的可执行文件中?
【问题讨论】:
标签: .net visual-studio assemblies
您可以使用ILMerge 将多个程序集合并为一个。
【讨论】:
Jeffrey Richter 有一篇关于这个主题的文章:
关键是
对于您添加的每个 DLL 文件,显示其属性并将其构建操作更改为嵌入式资源。
【讨论】:
这是对我有用的解决方案:
它在每次构建后使用 ILMerge 合并程序集(如 cmets 中建议的那样)。我需要为 .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 之类的地方。在构建后事件命令行中编写命令。
$(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,您可以单独运行它。
【讨论】: