Mkbundle Mono Сборка перенаправление привязки
У меня есть пример приложения.NET, которое отлично работает на Windows, и моя среда Ubuntu, использующая моно.
Я пытаюсь использовать 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
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
Немного поздний ответ, но у него были те же проблемы, и просто сделать это было недостаточно, так как я хотел статически связать среду выполнения Mono (используя опцию --static). Это связано с отсутствующими сборками GAC, которые пропускают --skip-scan и / или --nodeps, включая любые транзитивные зависимости, которые они могут иметь. Конечно, это влияет только на машины без установленного Mono (он все равно будет использовать GAC Mono, если он там есть), что усложнит его тестирование.
Предоставление -skip-scan и -nodeps означает, что вам нужно предоставить список DLL самостоятельно (минуя сканер сборок mkbundle), что позволит вам либо сделать это вручную, либо написать свой собственный сканер, который я сделал, который обнаруживает каждую отдельную сборку, в том числе и в.NET Framework. Я не хотел перечислять каждую сборку вручную, и если я пропустил одну, есть ошибки во время выполнения. Благодаря этому я смог обойти проблемы связывания сборки app.config.
Добавление флага --skip-scan, похоже, решает проблему без необходимости прибегать к --nodeps и ручному списку библиотек зависимостей.
mkbundle -z --deps --skip-scan MyApp.exe
Обратите внимание, что в mono 4.2.3 mkbundle, похоже, предпочитает сборки в моно дистрибутиве сборкам в локальной папке. Это может вызвать проблемы, если у вас есть конфликт имен между локальной сборкой и сборкой фреймворка (вероятным кандидатом является System.Web.Http.dll).
Вы можете обойти это, указав конфликтующую локальную сборку в командной строке с префиксом./
mkbundle -z --deps --skip-scan MyApp.exe ./System.Web.Http.dll
Эта вторая проблема, кажется, решена в более новых версиях моно.