Mkbundle от Mono в Linux нарушает работу приложения XSockets с помощью XSockets.Плагин.Фреймворк.Composable —> DirectoryNotFoundException

#c# #mono #xsockets.net #mkbundle

#c# #mono #xsockets.net #mkbundle

Вопрос:

Я работаю над самоподдерживающимся веб-приложением, встраивая в него серверы. Один из серверов — это сервер WebSocket, работающий на XSockets.

Если я xbuild найду решение, а затем mono Application.exe — работает, как ожидалось.

Если я тогда mkbundle --deps -o nancy-xsockets.so Application.exe ... (обратите -o внимание, что они находятся в том же каталоге, то ... на самом деле это пути к требуемым сборкам) и запускаю с ./nancy-xsockets.so ним, работает так, как ожидалось.

Затем, если я mkbundle --deps -o MKBUNDLE/nancy-xsockets.so Application.exe ... (замечаю -o , что он НЕ НАХОДИТСЯ в том же каталоге), и запускаю с MKBUNDLE/nancy-xsockets.so ним — он работает, как ожидалось.

Теперь, если я cd MKBUNDLE и тогда ./nancy-xsockets.so меня приветствует эта ошибка:

 Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for XSockets.Plugin.Framework.Composable ---> System.IO.DirectoryNotFoundException: Directory '/usr/lib/mono/gac/XSockets.Plugin.Framework/1.4.3.0__e0d515f22052a108' not found.
  at System.IO.Directory.ValidateDirectoryListing (System.String path, System.String searchPattern, System.Booleanamp; stop) [0x00000] in <filename unknown>:0
  at System.IO.Directory.GetFileSystemEntries (System.String path, System.String searchPattern, FileAttributes mask, FileAttributes attrs) [0x00000] in <filename unknown>:0
  at System.IO.Directory.GetFiles (System.String path, System.String searchPattern) [0x00000] in <filename unknown>:0
  at System.IO.Directory.GetFiles (System.String path, System.String searchPattern, SearchOption searchOption) [0x00000] in <filename unknown>:0
  at XSockets.Plugin.Framework.Composable <>c__DisplayClass9.<AddLocation>b__8 (System.String fi) [0x00000] in <filename unknown>:0
  at System.Linq.Enumerable <CreateSelectManyIterator>c__Iterator12`2[System.String,System.String].MoveNext () [0x00000] in <filename unknown>:0
  at XSockets.Plugin.Framework.Composable.AddLocation (System.String assemblyLocation, SearchOption searchOption, Boolean ignoreException) [0x00000] in <filename unknown>:0
  at XSockets.Plugin.Framework.Composable.SetPluginCatalog () [0x00000] in <filename unknown>:0
  at XSockets.Plugin.Framework.Composable..cctor () [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
  at Core.Bootstrap.XSocket (Int32 port) [0x00000] in <filename unknown>:0
  at Core.Bootstrap.Start (Int32 nancyPort, Int32 xSocketPort) [0x00000] in <filename unknown>:0
  at Core.Startup.Main (System.String[] args) [0x00000] in <filename unknown>:0

Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
  at Core.Bootstrap.Dispose () [0x00000] in <filename unknown>:0
  at Core.Startup.Main (System.String[] args) [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
  at Core.Bootstrap.Dispose () [0x00000] in <filename unknown>:0
  at Core.Startup.Main (System.String[] args) [0x00000] in <filename unknown>:0
  

Кажется, это происходит, когда в рабочем каталоге нет ни одного из .dll них.

Такое ощущение, что XSockets не может найти конфигурацию и возвращается к значению по умолчанию.

Как мне исправить эту проблему?

Обновить:

Стоит отметить, что с mkbundle помощью, я действительно поручаю ему собрать все вместе. В итоге я получаю один исполняемый файл «nancy-xsockets.so «, когда я запускаю его, он выдает ошибку с приведенным выше сообщением. Предполагая, что ответ Уффе может помочь, очевидным выбором было бы добавить корневой путь к исполняемым файлам в Composable, но в моем случае Composable.AddLocation , похоже, не помогло — та же ошибка.

Я с нетерпением ждал, чтобы увидеть, в чем может заключаться проблема, поскольку, если *.dll сборки находятся с одним исполняемым файлом в одном каталоге, он, похоже, работает (вероятно, загружает их вместо того, чтобы заглядывать внутрь объединенной сборки). Я начал удалять *.dll файлы один за другим, пока не наткнулся на то, что это точно XSockets.Plugin.Framework.dll .

Итак, если у меня есть это содержимое:

 [root@web-apps Release]# ls
modules  nancy-xsockets.so
  

Последующий вызов:

 [root@web-apps Release]# ./nancy-xsockets.so
  

В конечном итоге появится ошибка, как показано выше.

Но, если у меня есть:

 [root@web-apps Release]# ls
modules  nancy-xsockets.so  XSockets.Plugin.Framework.dll
  

Следующие вызовы выполняются безупречно:

 [root@web-apps Release]# ./nancy-xsockets.so
Looking for modules in: /root/stoneos-nancy-xsockets/Release/modules
Starting Nancy on: 1337, XSockets on: 1338
Adding path /root/stoneos-nancy-xsockets/Release to XSockets Composable
XSockets and Nancy started.
Press any key to exit.
  

Похоже, это проблема в XSockets, а точнее, XSockets.Plugin.Framework.Composable . Кажется, что вызывается статический конструктор SetPluginCatalog , который затем вызывается AddLocation и, вероятно, завершается неудачей на этом шаге, когда mkbundle d.

Есть ли какой-нибудь способ отключить это местоположение «по умолчанию»?

Ответ №1:

У меня нет опыта работы с Nancy, но я знаю, что если в рабочем каталоге нет сборок, вы должны указать фреймворку плагина, где искать, прежде чем начать его использовать.

Например, строка ниже добавит местоположение «c:temptest «чтобы фреймворк искал там сборки.

 Composable.AddLocation("c:\temp\test");
  

Это следует сделать перед запуском сервера. Если вы сделаете это после запуска, вам придется добавить еще одну строку

 Composable.AddLocation("c:\temp\test");
Composable.ReCompose();
  

Комментарии:

1. Какие сборки ему нужны? mkbundle , я думаю, собирает их все вместе.

2. См. Обновление. Есть ли какой-либо способ отключить Composable местоположение по умолчанию (которое устанавливается SetPluginCatalog )?