我有一个示例.NET应用程序在Windows上运行正常,而我的Ubuntu环境使用mono。
我正在尝试使用Mkbundle来创建一个单独的本机程序集,因此我可以使用busybox对其进行封装,并保持较小的大小而不是通常庞大的膨胀容器。
我遇到的问题是Json.net,我认为它是由于app.config文件中的程序集绑定重定向,其他人遇到了这个问题?
<?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>
使用和不使用--static产生以下错误
答案 0 :(得分:3)
我如何解决它是指定--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
答案 1 :(得分:3)
有点迟到但有相同的问题并且这样做不够,因为我想静态链接Mono运行时(使用--static选项)。这是由于缺少GAC程序集--skip-scan和/或--nodeps未命中,包括这些可能具有的任何传递依赖性。当然,这只会影响没有安装Mono的机器(如果它在机器上,它仍会使用Mono的GAC),这也使得测试更加困难。
提供-skip-scan和-nodeps意味着您需要自己提供DLL列表(绕过mkbundle程序集扫描程序),允许您手动执行此操作或write your own scanner which I did选择每个程序集,包括.NET框架。我不想手动列出每个组件,如果我错过了一个有运行时错误。有了这个,我也能够解决app.config程序集绑定问题。
答案 2 :(得分:2)
添加--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
第二个问题似乎在较新版本的mono中得到解决。