我正在尝试让一个基本的VS 2012项目与ILMerge一起工作,这样我最终可以使用更复杂的例子(并最终能够在我的实际项目中使用它)。
目前,我在工作项目中有一个工作项目TestMain和一个参考库TestDLL。
我的工作目录(..\bin\Release)如下:
我的终端输出如下:
C:...\bin\Release>ilmerge /target:winexe /out:ContainedProgram.exe "TestMain.exe“"TestDLL.dll” 合并过程中发生异常: ILMerge.Merge:未能从位置‘C:\bin\ location \TestMain.exe’加载程序集。跳过和处理其余的参数。在ILMerging.ILMerge.Merge() 在ILMerging.ILMerge.Main(String[] args)
很简单对吧?我在这里错过了什么?
更新:删除.exe并运行仅使用库的ILMerge。删除.dll并仅使用可执行文件运行它不会更改错误输出。
我还创建了第二个.dll,并能够使用ILMerge将两个现有库合并为一个库,如下所示:
ilmerge /targetplatform:v4,c:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:Test.dll "TestDLL2.dll“"TestDLL.dll”
更新2,因此我能够使用以下内容创建TestRun.exe:
ilmerge /targetplatform:v4,c:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:TestRun.exe "TestMain.exe“"Test.dll”
这将两个参考库..dll打包在一起,并将它们打包到我的可执行文件中。而且起作用了!我得到了预期的结果。
直到我把我的新的可执行文件移出它的主文件夹。
一旦我将它移到一个新的位置,执行就会产生以下错误:
未处理的异常: System.IO.FileNotFoundException:无法加载文件或程序集'TestDLL、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null‘或其依赖项之一。系统找不到指定的文件。 在TestMain.Program.Main(String[] args)
发布于 2013-02-28 17:46:07
您使用的是什么版本的框架?例如,如果使用的是4.0/4.5,则可能需要设置There平台选项。
/targetplatform:version,platformdirectory
发布于 2020-11-10 18:45:53
这是一个重复的答案,因为这是我很快找到的另一个相关问题,但这无助于解决我的问题。
我回答这个老问题是因为我没有找到我自己关于堆栈溢出的相关问题的答案,它可能会对其他人有所帮助。在我的例子中,我试图在VS2013中触摸和重建一个旧的解决方案,以修复安装程序中的一个故障(不承认IIS10比IIS4更新)。
合并操作给了我一个“系统找不到指定的错误代码0x80070002”,如果您忽略了错误并安装了应用程序,它将陷入运行时异常。当然,“指定的文件”就在build文件夹中。
造成这个问题的根本原因是4.0之后的框架是一个“就地升级”,其中一些依赖项在核心库中移动(长时间的讨论请参阅:http://www.hurryupandwait.io/blog/what-you-should-know-about-running-ilmerge-on-net-4-5-assemblies-targeting-net-4-0)。它的长度和缺点是,您可能有几个版本的ilmerge可供您使用,但只有最近的版本才保证能够准确地解除您的依赖关系,以便在运行时找到东西,而不是缺少指定的文件,而是指向底层调用的指针。
在我的例子中,解决方案是找到从NuGet检索的一个版本的ilmerge,并从我的旧解决方案中引用该版本,同时保留其他所有内容。(我本应该知道这一点的,但我当时很匆忙/没有想清楚,错误信息是误导性的……)
https://stackoverflow.com/questions/15140952
复制相似问题