ILMerge和.NET 4.0的严重问题

dev*_*os1 10 .net wpf ilmerge .net-4.0

对于我的生活,我似乎无法让我的.NET 4应用程序与ILMerge正确合并.即使在设置/ targetplatform,/ lib,/ ndebug 添加自定义ILMerge.exe.config文件之后,输出文件也无法正常工作(它似乎无法"找到"合并的库).

我试过这个,无济于事.除非我使用配置文件,否则我甚至无法构建它,但是当我这样做时它不起作用.没有配置文件,我一直收到错误消息" 不允许未解析的程序集引用:PresentationFramework ".

以下是我的ILMerge命令用作后期构建事件的当前状态:

ilmerge.exe /out:C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\bin\Release\OrangeNote.exe 
  /ndebug /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
  /lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319" 
  /lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\obj\Release\OrangeNote.exe" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Lucene.Net\src\Lucene.Net\bin\Release\Lucene.Net.dll" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Ookii.Dialogs\src\Ookii.Dialogs.Wpf\bin\Release\Ookii.Dialogs.Wpf.dll" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\SharpZipLib\bin\ICSharpCode.SharpZipLib.dll" 
  "C:\Users\Logan\Documents\Visual Studio 2010\Projects\HumanInterfaceProject\HumanInterfaceProject\bin\Release\HipLib.dll"
Run Code Online (Sandbox Code Playgroud)

对我做错了什么的想法?

Rob*_*Rob 8

我在WPF中看到用于组合.dll的一个建议是简单地将dll作为项目的嵌入资源添加,然后以编程方式将dll加载到程序集中.

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {

   String resourceName = "AssemblyLoadingAndReflection." +

      new AssemblyName(args.Name).Name + ".dll";

   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {

      Byte[] assemblyData = new Byte[stream.Length];

      stream.Read(assemblyData, 0, assemblyData.Length);

      return Assembly.Load(assemblyData);

   }

};
Run Code Online (Sandbox Code Playgroud)

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


Sim*_*mon 8

你可以试试Costura.

https://github.com/Fody/Costura#how-it-works

它基本上需要Jeffrey Richters的评论

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

但它是否以一种你不需要编写任何代码的方式.即你不需要编写"AssemblyResolve"方法


dev*_*os1 7

我通过电子邮件向ILMerge的作者Mike Barnett发送电子邮件,他解释说它根本不适合与WPF应用程序一起使用,当我告诉他我使用WPF 3.5应用程序时,我很惊讶.由于它并没有得到真正的支持,我现在就把它写下来,等待另一种替代方案展现自己.

作为旁注,我确实从Eziriz尝试了.NET Reactor ,它实际上运行得很好,但是花费180美元,对于一个我不太愿意花费的爱好项目.但这比Red Gate的其他商业替代品便宜很多,所以我想提到它.

更新: Mike Barnett现在认为这个问题的接受答案是最佳解决方案.据他说,如果他知道这是可能的,他从来没有写过ILMerge.


Ste*_*ary 6

虽然ILMerge确实不更新WPF资源字符串,但它可以用于通过将引用程序集目录而不是运行时目录传递给WPF引用来合并程序集/targetplatform,如下所示:( /targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client"对于.NET 4.0客户端配置文件).

我使用它来合并Rx的System.Reactive.dll,它有一个引用Dispatcher,但没有任何实际的WPF资源.