C# 使用GeckoFX浏览器控件时未找到xul.dll错误

C# 使用GeckoFX浏览器控件时未找到xul.dll错误,c#,wix,xulrunner,geckofx,C#,Wix,Xulrunner,Geckofx,我使用“GeckoFx-29.0-0.6”在Windows窗体应用程序中使用firefox web浏览器控件 当我运行带有GeckoFX浏览器控件的Windows窗体应用程序时,一切正常 我在应用程序中使用以下代码 Gecko.Xpcom.Initialize("xulrunner/"); 我使用xcopy加载bin文件夹和xulrunner文件夹。因此,在这个场景中,xul运行程序是从找到application.exe的同一个loaction加载的 当我对我的应用程序进行wix设置时,我正在

我使用“GeckoFx-29.0-0.6”在Windows窗体应用程序中使用firefox web浏览器控件

当我运行带有GeckoFX浏览器控件的Windows窗体应用程序时,一切正常

我在应用程序中使用以下代码

Gecko.Xpcom.Initialize("xulrunner/");
我使用xcopy加载bin文件夹和xulrunner文件夹。因此,在这个场景中,xul运行程序是从找到application.exe的同一个loaction加载的

当我对我的应用程序进行wix设置时,我正在执行相同的过程,我的xulrunner文件夹与application.exe位于同一位置。但是应用程序无法调用windows窗体。它显示消息“无法加载DLL‘xul’”

我通过更改设置,将xulrunner文件夹复制到c:/windows/system32文件夹位置,解决了此问题。当我这样做时,应用程序在某些机器上成功运行,但在其他机器上不工作


有没有办法解决这个问题?这样我就不需要将xulrunner放在system32文件夹中了?

您可以尝试给出xulrunner目录的完整路径。做一些类似于:

var programDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Gecko.XpCom.Initialize(Path.Combine(programDirectory, "xulrunner");
如果安装了应用程序,并且您已将xulrunner放置在输出目录中,那么这将起作用。如果您不想麻烦地将其复制到那里,那么您需要将上面的代码变得更智能一些,这样当您刚从VisualStudio运行时,它就可以在您放置xulrunner的位置找到它


我们用于在多种条件下智能查找文件的类是开源的,您可以获取并使用它。

我在尝试修复此问题时浪费了很多时间,发现错误是由于geckofix和Xulruner版本不匹配造成的。它们应该是相同的。查看此链接以了解更多信息

这同样有效

Gecko.Xpcom.Initialize(Environment.CurrentDirectory + "\\xulrunner");

注意,我知道这篇文章很老,但我发现了一些东西。如果您使用VisualStudio(2019是我在本文发布时的版本),并且您添加了via NuGet,那么还有一个包。当您从Visual Studio NuGet Manager中阅读此软件包的说明时,它会说:

这应该只用于建造壁虎。。。不要用这个 如果您只想在应用程序中包含Geckofx,请使用此包

好吧,我还是下载了它,检查了这个包的内容,注意到它有Geckofx.45在运行时(init)期间抱怨丢失的所有文件。一、 因此,添加了这个包,Geckofx现在完全按照它所指示的方式工作

允许在C#应用程序中嵌入gecko的库

用法示例:


希望这有帮助。这一次让我兜了一圈。

当您忘记运行Xpcom.Initialize(“Firefox64”)行时,您将得到该错误在使用GeckoWebBrowser之前

谢谢。我会试试这个。这个也帮我修好了
        [STAThread]
        static void Main(string[] args)
        {
            Xpcom.Initialize("Firefox64");
            var geckoWebBrowser = new GeckoWebBrowser {Dock = DockStyle.Fill};
            Form f = new Form();
            f.Controls.Add(geckoWebBrowser);
            geckoWebBrowser.Navigate("www.google.com");
            Application.Run(f);
        }