如何将引用的项目导入到exe中?

时间:2011-09-21 13:49:34

标签: .net visual-studio assemblies

我有一个控制台应用程序,它引用了解决方案中的其他项目。当我构建它时,它将在Debug中复制这些dll。我想在exe中导入它们。如果我将它们添加到资源然后从那里加载,它们不会更新。我丢失了引用的DLL的更改。有没有办法可以构建它们并将它们导入到每个构建的可执行文件中?

3 个答案:

答案 0 :(得分:4)

您可以使用ILMerge将多个程序集合并为一个。

答案 1 :(得分:0)

杰弗里里希特有一篇关于这个主题的文章:

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

关键是

对于您添加的每个DLL文件,显示其属性并将其构建操作更改为嵌入式资源。

答案 2 :(得分:0)

这是适用于我的解决方案:

http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx

它在每次构建之后使用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="&quot;$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe&quot; /out:@(MainAssembly) &quot;@(IntermediateAssembly)&quot; @(IlmergeAssemblies->'&quot;%(FullPath)&quot;', ' ') /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,您可以单独运行它。