我有一个使用GeckoFX / xulrunner 22的应用程序。 这个程序在Windows中运行良好,但无论我做什么,我都无法在Linux或Mac上运行它。
主要关注的是Mac。
我尝试过更换不同版本的Windows,Linux& Mac xulrunner运行时以及不同的初始化字符串尝试包括Windows,Linux和Mac版本(当然一次只有一个),如:
Gecko.Xpcom.Initialize("lib/xulrunner");
Gecko.Xpcom.Initialize("lib/XUL.framework/Versions/Current");
我也试过用" ./"加前缀;以及使用代码获取当前工作目录以预先添加到路径。
我还尝试将十几个不同版本的xul.dll复制到其中的可执行文件夹和子目录中。
无论我想要尝试什么,或者搜索这个网站/ google尝试什么都没有用。
这在Initialize()调用失败。 程序/类名只会被加星标,所以当人们搜索该程序时,这不是Google中首次出现的内容。
虽然我最关心的是让它在Mac上运行,但我还会提到由于Stack Overflow上的其他帖子以及我的Linux系统上的其他帖子,我已经尝试安装各种版本的Firefox并且路径指向其他人民'说明。它总是显示与Mac上相同的错误。
错误如下:未处理的异常: System.DllNotFoundException:xul at(包装器托管到原生)Gecko.Xpcom:Alloc(intptr) 在Gecko.nsAString..ctor()[0x00000]中:0 在Gecko.nsAString..ctor(System.String值)[0x00000]中:0 在Gecko.Xpcom.Initialize(System.String binDirectory)[0x00000] in:0 在**********。**********。CreateBrowsers()[0x00000] in:0 在**********。**********。********** _显示(System.Object sender,System.EventArgs e)[0x00000] in: 0 在System.Windows.Forms.Form.OnShown(System.EventArgs e)[0x00000] in:0 在System.Windows.Forms.Form.SetVisibleCore(布尔值)[0x00000]中:0 在System.Windows.Forms.Control.set_Visible(布尔值)[0x00000]中:0 at(wrapper remoting-invoke-with-check)System.Windows.Forms.Control:set_Visible(bool) 在System.Windows.Forms.Application.RunLoop(Boolean Modal,System.Windows.Forms.ApplicationContext context)[0x00000] in :0 在System.Windows.Forms.Application.Run(System.Windows.Forms.ApplicationContext context)[0x00000] in :0 在System.Windows.Forms.Application.Run(System.Windows.Forms.Form mainForm)[0x00000] in:0 在**********。Program.Main()[0x00000] in:0 [ERROR]致命的未处理异常:System.DllNotFoundException:xul at(包装器托管到原生)Gecko.Xpcom:Alloc(intptr) 在Gecko.nsAString..ctor()[0x00000]中:0 在Gecko.nsAString..ctor(System.String值)[0x00000]中:0 在Gecko.Xpcom.Initialize(System.String binDirectory)[0x00000] in:0 在**********。**********。CreateBrowsers()[0x00000] in:0 在**********。**********。********** _显示(System.Object sender,System.EventArgs e)[0x00000] in: 0 在System.Windows.Forms.Form.OnShown(System.EventArgs e)[0x00000] in:0 在System.Windows.Forms.Form.SetVisibleCore(布尔值)[0x00000]中:0 在System.Windows.Forms.Control.set_Visible(布尔值)[0x00000]中:0 at(wrapper remoting-invoke-with-check)System.Windows.Forms.Control:set_Visible(bool) 在System.Windows.Forms.Application.RunLoop(Boolean Modal,System.Windows.Forms.ApplicationContext context)[0x00000] in :0 在System.Windows.Forms.Application.Run(System.Windows.Forms.ApplicationContext context)[0x00000] in :0 在System.Windows.Forms.Application.Run(System.Windows.Forms.Form mainForm)[0x00000] in:0 在**********。Program.Main()[0x00000] in:0
答案 0 :(得分:1)
首先,据我所知,没有人在OSX上运行过geckofx。
您看到的问题可能很容易解决,但在让geckofx在Mac上运行之前,您可能会遇到更多问题。
Windows上的Geckofx架构非常简单。 GeckoWebBrowser控件是一个基于winforms的控件,下面是win32控件,windows上的gecko / firefox也使用win32控件。
然而在Linux上,由于gecko / firefox使用GTK而单声道winform实现基于X11,因此事情稍微复杂一些。因此geckofx有一些相当复杂的代码使这一切都有效。 (这就是为什么需要在Linux上使用不同版本的geckofx(一个定义了GTK标志的geckofx)。
首先在OSX上,您必须确定单声道用于winforms的UI工具包,是X11,碳还是其他?那么你必须确定Firefox在OSX,碳,可可还是别的东西上使用哪个工具包?如果他们碰巧匹配那么它可能值得继续使用geckofx的windows构建。如果它们不同,那么您可能需要修改geckofx本身来处理这个问题。
现在开始 DllNotFoundException。
PInvoke / DllImport调用可能正在寻找" xul.dll"。在OSX的firefox(例如libxul.so)中可以将此文件命名为不同的文件,因此需要dllmap配置文件将xul.dll映射到正确的文件。
同样设置这两个环境变量,MONO_LOG_LEVEL =" debug"和MONO_LOG_MASK =" dll"应该为您提供有用的调试信息。
此外,可以使用Gecko.Xpcom.Initialize的绝对路径来避免任何有关查找路径的混淆。