对于我的生活,我似乎无法让我的.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)
对我做错了什么的想法?
我在C#中编写了一个项目,它使用了大量的图像,Milk模型和openGL,我想将所有内容打包在一个exe中,这样我就可以将它上传到我的网站了.现在我得到了一个依赖于jpgs等其他文件的exe.我尝试过使用ILMerge但无法使用它.有更简单的解决方案吗?谢谢.
我想知道在创建要包含在与依赖关系相关的其他项目中的库的版本时是什么启发式,以及我是否应该包含它们.
我的问题如下:
我有一个CommonUtilities库,它提供了一组可以在多个地方使用的实用程序.CommonUtilities的依赖包括log4net.dll(日志框架)和Oracle.DataAccess.dll(数据库驱动程序).
我有另一个名为MyProject的项目,我希望将CommonUtilities包含在内.MyProject还依赖于Oracle.DataAccess.
如果我使用ILMerge并将CommonUtilities合并到单个程序集CommonUtilities.dll中并引用来自MyProject的所有内容进行编译,但我确信我应该从MyProject明确引用Oracle.DataAccess,因为它是依赖项而不是使用合并到CU的程序集.添加对Oracle.DataAccess的引用也会导致使用不明确的语句,因为引用了两个Oracle.DataAccess程序集.
在我的情况下使用ILMerge/Internalize会导致编译错误,因为内部化Oracle.DataAccess程序集中的类型是从CommonUtilities返回的,因为它们被标记为内部MyProject无法识别返回的类型.
使这项工作的唯一方法就是不将这个特定的程序集(Oracle.DataAccess)合并到CommonUtilities中,而只是从MyProject引用它.这反过来又会产生一个新问题:我应该引用哪个Oracle.DataAccess.dll - 与CommonUtils一起分发的依赖关系?
还有其他方法可以解决这一切吗?
摘要
我想改变2程序集解决方案的构建过程,以便调用ILMerge,并且构建会产生单个程序集.此外,我希望能够调试到最终的程序集.
准备 - 一个简单的例子
您现在有一个2组装应用程序,它将"Hello World"输出到控制台.
那么下一步..?
我想改变Console应用程序构建过程,包括使用ILMerge的post构建步骤,将ClassLibrary程序集合并到Console程序集中
在这一步之后,我应该能够:
成功有限
我阅读了这篇博文,并设法实现了我之后使用后期构建命令进行的合并...
"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName)
Run Code Online (Sandbox Code Playgroud)
...和一个读取的ILMerge.bat文件......
CD %1
Copy %2.exe temp.exe
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll
Del temp.exe
Del ClassLibrary1.*
Run Code Online (Sandbox Code Playgroud)
这样可以很好地工作,并且实际上产生了一个在VS环境之外运行的exe.但是,它似乎不会产生VS能够用于调试代码的符号(.pdb文件).
我认为这是拼图的最后一块.
有谁知道我怎么能做这个工作?
FWIW我在x64 Win7 x64机器上运行VS2010.
更新:我为什么要这样做?
有人问:'在调试场景中我真的需要ILMerge吗?'
我的解决方案的程序集需要与其他解决方案(其中一些我可能会开发)共存于同一文件夹中
其中一些解决方案将共享某些程序集的不同版本的依赖关系.
因此,Solution1可能由Console1和ClassLibrary1.dll(v1)组成,而Solution2可能由Console2和Classlibrary1.dll(v2)组成.
我没有在GAC中注册所有内容,而是认为我可以将正确版本的依赖项ILMerge到解决方案的主要程序集中以避免冲突.
然而,这目前使得无法调试解决方案,我需要将其与将要出现的其他解决方案结合使用.
这听起来很复杂吗?那是因为它是......:D
我有一个基础项目,可以提供两个不同的项目.我希望能够让主项目在编译时将所有引用编译成一个dll.
这需要是项目构建中内置的东西,以便Jr开发人员不必担心它.
解决方案:我最后在项目的Post-build操作中添加了一行,以便良好的构建执行以下操作:
$(ProjectDir)ilmerge.exe /out: /ver: <.dll> <.dll>
Run Code Online (Sandbox Code Playgroud)
ilmerge.exe 被移动到项目中,上面的线路获取了dll并创建了一个.
我正在使用ILMerge将已使用的库合并到控制台应用程序中.合并后,生成的exe只在一秒内完成执行并在后台运行(不显示其输出Console.WriteLine).
我可以做什么来实际将其作为控制台应用程序运行?
是否存在将单个.NET程序集拆分为完整程序集子集的实用程序?即ILMerge.exe的"功能逆转"?
当然,如果它必须跟踪类,函数等之间的依赖性等,那么这个工具很难产生.
但是,我正在寻找的情况是我有一个非常大(数百MB)的混合模式程序集,主要是静态类和静态方法,基本上只是一个函数库.虽然,与一些DLLMain初始化和类似.
我想要的是能够在我希望保留在子集程序集中的特定静态类上指定静态方法列表.从技术上讲,这应该是可能的,因为程序集只是具有标准格式的二进制信息.
这是否存在或如何制作?或者为什么这不切实际?
我试图把.dll文件放在我的.exe文件中,我收到此错误:
ILMerge.exe: The assembly 'Final' has a value for it's PeKind flag
'Ilonly, requires32bits' that is not compatible with 'Ilonly, requires 32
bits, prefers32bits'
Run Code Online (Sandbox Code Playgroud)
我在命令行中输入了以下命令:
ILMerge.exe exe\ConsoleApplication1.exe lib\Final.dll /out:Final.exe /closed /zeroPeKind
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?我不确定这意味着什么,谢谢!
我有两个.NET库:"Foo.Bar"和"Foo.Baz".
"Foo.Bar"是自包含的,而"Foo.Baz"引用"Foo.Bar".
假设我执行以下操作:
在使用外部项目的功能时,Foo1.dll和Foo2.dll的性能是否会有任何差异?如果是这样,这种性能差异有多大,是一次性(负载?)还是持续的差异?这两种方法都有其他优点或缺点吗?
我正在使用ILMerge从包含1个exe和2个资源dll的项目中创建单个程序集应用程序:
这是一个简单的测试项目,有1个表单(Form1.cs),所以没什么特别的.我的目标是使用工作资源管理器创建一个单独的程序集应用程序(我已阅读ILMerge和本地化资源程序集以及单程序集多语言Windows窗体部署(ILMerge和附属程序集/本地化) - 可能吗?有关如何执行的信息这个).
编译项目后,我使用以下命令行参数运行ILMerge:
ilmerge /log:test.txt /target:winexe /copyattrs /allowdup /out:test_merged.exe
"C:\projectdir\bin\Debug\test.exe" "C:\projectdir\bin\Debug\fr-FR\test.resources.dll"
"C:\projectdir\bin\Debug\nl-BE\test.resources.dll"
Run Code Online (Sandbox Code Playgroud)
如果我使用Reflector检查合并程序集的内容,我在资源树节点下看到以下内容:
而不是fr-FR和nl-BE资源,我有2倍的fr-FR资源.这是因为资源dll的名称相同吗?结果是我只能在运行时获取fr-FR资源.
有任何想法吗 ?
更新(日志文件内容):(注意:二进制文件以"loc_"为前缀,为了清楚起见,我在之前的帖子中将它们删除了)
ILMerge version 2.10.526.0
Copyright (C) Microsoft Corporation 2004-2006. All rights reserved.
ILMerge /log:loc_test.txt /target:winexe /copyattrs /allowdup /out:loc_test_merged.exe c:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\loc_test.exe C:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\fr-FR\loc_test.resources.dll C:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\nl-BE\loc_test.resources.dll
Set platform to 'v2', using directory 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\..\v2.0.50727' for mscorlib.dll
Running on Microsoft (R) .NET Framework …Run Code Online (Sandbox Code Playgroud) ilmerge ×10
.net ×5
c# ×5
assemblies ×2
.net-2.0 ×1
.net-4.0 ×1
debugging ×1
dll ×1
il ×1
mixed-mode ×1
performance ×1
symbols ×1
winforms ×1
wpf ×1