我正在通过将服务器嵌入其中来开发自我维护的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时可能在此步骤失败。
有没有办法禁用这个“默认”位置?
答案 0 :(得分:0)
我没有南希的经验,但我知道如果工作目录没有程序集,你必须在开始使用之前告诉插件框架在哪里查看。
例如,下面的行会添加位置&#34; c:\ temp \ test&#34;这样框架就可以在那里寻找装配体。
Composable.AddLocation("c:\\temp\\test");
这应该在启动服务器之前完成。如果你在开始后这样做,你将不得不添加另一行
Composable.AddLocation("c:\\temp\\test");
Composable.ReCompose();