2015-06-10 6 views
3

У меня есть пример приложения .NET, который отлично работает на окнах, и моя среда Ubuntu с использованием моно.Mkbundle 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

ответ

2

Как я получил вокруг него было указать --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 
0

Добавление флага -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 

Это вторая проблема, как представляется, быть решены в новых версиях моно.

2

Немного позднего ответа, но с теми же проблемами, и просто делать это было недостаточно, так как я хотел связать статическое время Mono статически (используя опцию --static). Это связано с отсутствием сборок GAC, которые пропускают -skip-scan и/или -nodeps, включая любые транзитивные зависимости, которые они могут иметь. Конечно, это влияет только на машины без установленного Mono (он все равно будет использовать GAC Mono, если он есть на машине), что также затрудняет тестирование.

Поставка -skip-scan и -nodeps означает, что вам нужно предоставить список DLL самостоятельно (минуя сканер сборки mkbundle), позволяющий либо выполнить это вручную, либо write your own scanner which I did, который собирает каждую отдельную сборку, в том числе в платформе .NET , Я не хотел перечислять каждую отдельную сборку вручную, и если я пропущу одну, у меня будут ошибки во время выполнения. С этим я смог обойти также проблемы привязки сборки app.config.

Смежные вопросы