#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
)?