2

我正在尝试让一个基本的 VS 2012 项目与 ILMerge 一起使用,因此我最终可以升级到更复杂的示例(并最终能够在我的真实项目中使用它)。

目前我在工作项目中有一个工作项目,TestMain和一个参考库TestDLL

我的工作目录(..\bin\Release)如下:

  • ILMerge.exe
  • 测试DLL.dll
  • 测试DLL.pdb
  • 测试主程序
  • TestMain.exe.config
  • 测试主程序.pdb
  • TestMain.vshost.exe
  • TestMain.vshost.exe.config
  • TestMain.vshost.exe.manifest

我的终端输出如下:

C:...\bin\Release>ilmerge /target:winexe /out:ContainedProgram.exe "TestMain.exe" "TestDLL.dll"

合并期间发生异常:ILMerge.Merge:无法从位置“C:...\bin\Release\TestMain.exe”加载程序集。跳过和处理其余的参数。在 ILMerging.ILMerge.Merge()
在 ILMerging.ILMerge.Main(String[] args)

很简单,对吧?我在这里想念什么?

更新:删除 .exe 并仅使用库运行 ILMerge。删除 .dll 并仅使用可执行文件运行它不会更改错误输出。

我还制作了第二个 .dll 并能够使用 ILMerge 将两个现有库合并为一个,其中包含以下内容:

合并 /targetplatform:v4,c:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:Test.dll "TestDLL2.dll" "TestDLL.dll"

更新 2所以我能够使用以下内容创建一个 TestRun.exe:

合并 /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)

4

2 回答 2

1

您使用的是什么版本的框架?例如,如果您使用的是 4.0/4.5,则可能需要设置一个 targetplatform 选项。

/targetplatform:version,platformdirectory

于 2013-02-28T17:46:07.320 回答
1

[这是一个重复的答案,因为这是我相对较快地发现的另一个相关问题,但这并没有帮助我解决我的问题]

我正在回答这个老问题,因为我没有在 Stack Overflow 上找到我自己的相关问题的答案,它可能对其他人有所帮助。就我而言,我试图在 VS2013 中修改并重建一个旧的解决方案,以修复安装程序中的一个故障(不将 IIS10 识别为比 IIS4 更新)。

合并操作给了我一个“系统找不到指定的错误代码 0x80070002 的文件”,如果您忽略了该错误并安装了应用程序,它将陷入运行时异常。当然,“指定的文件”就在构建文件夹中。

这个问题的根本原因是 4.0 之后的框架是“就地升级”,其中一些依赖项围绕核心库移动(关于长时间的讨论,请参见:http ://www.hurryupandwait.io/blog/what-你应该知道关于运行 ilmerge-on-net-4-5-assemblies-targeting-net-4-0)。总而言之,您可能有多个版本的 ilmerge 可供您使用,但只有最新版本才能保证能够准确地解散您的依赖项,以便在运行时找到东西,而不是指定的文件是缺少,它是指向底层调用的指针。

在我的情况下,解决方案是找到从 NuGet 检索的 ilmerge 版本,并从我的旧解决方案中引用它,同时保留其他所有内容。(我应该知道这一点,但我很着急/没有直接思考,并且错误消息具有误导性......)。

于 2020-11-10T18:45:53.870 回答