10

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

我已经尝试过这个无济于事。除非我使用配置文件,否则我什至无法构建它,但是当我这样做时它不起作用。如果没有配置文件,我一直收到错误消息“ Unresolved assembly reference not allowed: 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"

关于我做错了什么的任何想法?

4

5 回答 5

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);

   }

};

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

于 2011-02-02T22:23:07.803 回答
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”方法

于 2011-08-10T22:58:34.667 回答
7

我给 ILMerge 的作者 Mike Barnett 发了电子邮件,他解释说它根本不适合与 WPF 应用程序一起使用,不幸的是,当我告诉他我可以与我的 WPF 3.5 应用程序一起使用时,我感到很惊讶。由于它并没有得到真正的支持,所以我现在就把它写下来,等待另一种替代方案出现。

附带说明一下,我确实从Eziriz试用了 .NET Reactor ,它确实效果很好,但要花费 180 美元,对于一个我还不太愿意花的爱好项目。但这比 Red Gate 的其他商业替代品便宜很多,所以我想我会提到它。

更新: Mike Barnett 现在认为这个问题的公认答案是最佳解决方案。据他说,如果他知道这是可能的,他一开始就不会写 ILMerge。

于 2010-08-05T19:57:56.890 回答
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 资源。

于 2010-09-16T15:40:53.743 回答
3

我注意到您的一个程序集称为“dialogs.wpf”。目前,ILMerge 不能正确地将程序集与其中的 WPF 资源合并。

关于这方面的信息不多,但这个论坛帖子提到了一个可能的解决方案,并且在回答这个问题时提到了几种可能性,但最高投票的建议只是购买商业替代品 - 我不知道是否这对你来说是一种可能性。

这里有一个讨论,解释了为什么它不起作用,这里有一个建议,更改 xaml 中的资源引用可能有助于解决问题

于 2010-07-30T13:27:11.540 回答