Mkbundle Mono程序集绑定重定向

时间:2015-06-10 18:05:03

标签: c# mono docker mkbundle

我有一个示例.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产生以下错误

enter image description here

3 个答案:

答案 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中得到解决。