对于我的生活,我似乎无法让我的.NET 4应用程序与ILMerge正确合并。即使在设置/ targetplatform,/ lib,/ ndebug 和添加自定义ILMerge.exe.config文件之后,输出文件也无法正常工作(它似乎无法“找到”合并的图书馆)。
我试过this和this无济于事。除非我使用配置文件,否则我甚至无法构建它,但是当我这样做时它不起作用。如果没有配置文件,我会始终收到错误消息“不允许未解析的程序集引用: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"
对我做错了什么的想法?
答案 0 :(得分: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);
}
};
答案 1 :(得分:8)
你可以尝试Costura。
https://github.com/Fody/Costura#how-it-works
它基本上需要Jeffrey Richters的评论
但它是否以某种方式不需要编写任何代码。即你不需要编写“AssemblyResolve”方法
答案 2 :(得分:7)
我通过电子邮件向ILMerge的作者Mike Barnett发送电子邮件,并且他解释说它根本不适合与WPF应用程序一起使用,当我告诉他我使用WPF 3.5应用程序时它很惊讶。由于它并没有得到真正的支持,我现在就把它写下来,等待另一种替代方案来呈现。
作为旁注,我确实从Eziriz尝试了.NET Reactor,它实际上运行得很好,但是花费180美元,对于一个我不太愿意花费的业余爱好项目。但这比Red Gate的其他商业替代品便宜很多,所以我想提到它。
更新:Mike Barnett现在认为这个问题的接受答案是最佳解决方案。据他说,如果他知道这是可能的,他一开始就不会写ILMerge。
答案 3 :(得分:6)
虽然ILMerge确实没有更新WPF资源字符串,但可以用于通过将引用程序集目录而不是运行时目录传递给/targetplatform
来合并程序集与WPF引用,因此:/targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client"
(对于.NET 4.0客户端配置文件)。
我使用它来合并Rx的System.Reactive.dll,它引用了Dispatcher
,但没有任何实际的WPF资源。
答案 4 :(得分:3)
我注意到你的程序集名为“dialogs.wpf”。目前,ILMerge没有正确地将程序集与其中的WPF资源合并。
关于此问题的信息不多,但this forum post提到了一种可能的解决方案,answers to this question提到了几种可能性,但最高投票建议只是购买商业替代方案 - 我不知道你是否有可能这样做。
有一个discussion here解释了为什么它不起作用,并且有一个建议here that changing the resource reference in the xaml may help solve the problem。