0

我正在通过将服务器嵌入其中来开发一个自我维持的 Web 应用程序。其中一个服务器是由XSockets提供支持的 WebSocket 服务器。

如果我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 ...(注意-oNOT BEING 在同一目录中)并运行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.Boolean& 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”,当我运行它时,它会因上述消息而出错。假设 Uffe 的回答可能会有所帮助,显而易见的选择是将可执行文件的根路径添加到 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并且可能在mkbundled.

有没有办法禁用这个“默认”位置?

4

1 回答 1

0

我在 Nancy 没有经验,但我知道如果工作目录没有程序集,您必须在开始使用它之前告诉插件框架在哪里查看。

例如,下面的行将添加位置“c:\temp\test”,以便框架在那里查找程序集。

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

这应该在启动服务器之前完成。如果你在开始后这样做,你将不得不添加另一行

Composable.AddLocation("c:\\temp\\test");
Composable.ReCompose();
于 2014-06-22T08:33:55.860 回答