Mac OS X,C#/ Mono - GeckoFX“System.DllNotFoundException:xul”

时间:2014-11-25 16:31:10

标签: c# windows macos mono geckofx

我有一个使用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

1 个答案:

答案 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的绝对路径来避免任何有关查找路径的混淆。