Linux上的Mono的mkbundle使用XSockets.Plugin.Framework.Composable打破了XSockets应用程序 - > DirectoryNotFoundException

时间:2014-06-19 08:01:32

标签: c# mono xsockets.net mkbundle

我正在通过将服务器嵌入其中来开发自我维护的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 ...(注意-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.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并且在mkbundle d时可能在此步骤失败。

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

1 个答案:

答案 0 :(得分:0)

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

例如,下面的行会添加位置&#34; c:\ temp \ test&#34;这样框架就可以在那里寻找装配体。

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

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

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