Mkbundle单声道程序集绑定redirect

我有一个示例.NET应用程序在Windows上运行正常,我的Ubuntu环境使用单声道。

我正在尝试使用Mkbundle来创build一个本地程序集,所以我可以通过使用busybox对docker进行容器化,并保持较小的尺寸,而不是通常巨大的容器。

我遇到的问题是与Json.net,我认为这是由于从app.config文件的程序集绑定redirect,任何人都跑到这?

<?xml version="1.0" encoding="utf-8"?> <configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /></startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> 

其产生以下错误,无论是否有 – 静态

在这里输入图像说明

我如何解决它是指定–nodeps标志。

 mkbundle --nodeps -o console OutsideSourcesAPI.exe *.dll 

但是,当你运行它,它可能会给你错误,如…

 The assembly mscorlib.dll was not found or could not be loaded. 

要么

 Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Xml, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. 

然后你必须手动指定任何缺失的依赖关系(我知道,有点臭)

 mkbundle --nodeps -o console OutsideSourcesAPI.exe *.dll mscorlib.dll System.Xml.dll 

有点迟到的答案,但有相同的问题,只是这样做是不够的,因为我想链接单声道运行时静态(使用 – 静态选项)。 这是由于缺lessGAC程序集–skip-scan和/或–nodeps未命中,包括这些可能具有的传递依赖关系。 当然,这只会影响没有安装Mono的机器(如果它在机器上,它仍然会使用Mono的GAC),这使得testing变得更加困难。

提供-skip-scan和-nodeps意味着你需要自己提供DLL列表(绕过mkbundle程序集扫描程序),这样你就可以手动执行这个程序,或者编写你自己的扫描程序,这样我就可以读取每个程序集,包括那些程序。 NET框架。 我不想手动列出每个程序集,如果我错过了运行时错误。 有了这个,我能够解决app.config程序集绑定问题。

添加–skip-scan标志似乎可以解决这个问题,而不必求助于-nodeps和一个手动的依赖dll列表。

 mkbundle -z --deps --skip-scan MyApp.exe 

请注意,从单声道4.2.3开始,mkbundle似乎更喜欢单声道发行中的程序集到本地文件夹中的程序集。 如果在本地程序集和框架程序集之间存在命名冲突(可能是System.Web.Http.dll),则会导致问题。

您可以通过在命令行中使用./前缀指定冲突本地程序集来解决此问题

 mkbundle -z --deps --skip-scan MyApp.exe ./System.Web.Http.dll 

这个第二个问题似乎解决了新版本的单声道。