c# - SetEnvironmentVariable 不更改 PATH 变量

标签 c# xulrunner

我使用的是 Se7enSoft 的 MozNet 插件。这是 FireFox 3.6 的 WebBrowser 控件。它使用 XulRunner。

我要做的第一件事是执行 Initialize(...) 方法。

var binDirectory = Path.GetDirectoryName(
    Assembly.GetExecutingAssembly().Location);
var xulRuntimeDirectory = Path.Combine(binDirectory, "xul");
Se7enSoft.MozNet.Xpcom.Initialize(xulRuntimeDirectory, null);

我必须将我们安装 XulRunner 的目录传递给它。 此插件的 Initialize 方法内部使用以下 DLLImport。

[DllImport("xpcom", CharSet = CharSet.Ansi, 
           EntryPoint = "NS_CStringContainerFinish",   
           CallingConvention = CallingConvention.Cdecl)]
internal static extern int Moz_CStringContainerFinish(ACString container);

需要 XulRunner 的 xpcom.dll 中的 NS_CStringContainerFinish 方法。

就在第一次调用此方法之前,MozNet 插件临时更改 PATH 环境变量。

Environment.SetEnvironmentVariable("path", 
    Environment.GetEnvironmentVariable("path") + ";" + 
    binDirectory, EnvironmentVariableTarget.Process);

XulRunner 的位置临时添加到 PATH 环境变量以确保它可以解析 xpcom.dll(和其他)。

但是还是找不到。我收到以下异常。

Unable to load DLL 'xpcom': Cannot find method. 
    (Exception from    HRESULT: 0x8007007F)
at Se7enSoft.MozNet.Native.MozNativeMethods.Moz_CStringContainerInit(
   ACString container)
at Se7enSoft.MozNet.Xpcom.XpCom_Init()
at Se7enSoft.MozNet.Xpcom.Initialize(String mozPath, String profPath)

此问题仅出现在 3 台 PC(Windows 2000 和 XP)上。适用于其他数百人。

如果我调试并跨过 Environment.SetEnvironmentVariable(...) 方法,我可以重现该问题。

SetEnvironmentVariable 是否存在任何可能阻止它更改 PATH 环境变量的问题?

最佳答案

找到原因。

DLLImport 语句使用dynamic link library search order 自动定位xpcom.dll 文件。 .

[DllImport("xpcom", CharSet = CharSet.Ansi, 
           EntryPoint = "NS_CStringContainerFinish",   
           CallingConvention = CallingConvention.Cdecl)]
internal static extern int Moz_CStringContainerFinish(ACString container);

简而言之,它搜索:

  1. 您的应用程序的安装目录。
  2. 系统目录
  3. 16位系统目录
  4. Windows目录
  5. 当前目录
  6. PATH 环境变量中的目录。

原来有问题的 3 台 PC 上有一个不同的 xpcom.dll 徘徊。这是最先发现的,然后 BOOM...异常丰富。

PATH 环境变量中列出的一个目录(UNC 路径)指向几个DLL,它们是xpcom.dll 的依赖项,即:

  • nspr4.dll
  • nss3.dll
  • plc4.dll
  • plds4.dll

我们通过仅为我们的进程更改 PATH 变量来修复它。通过将它添加到 PATH 环境变量的开头,确保我们的路径在任何其他路径之前被搜索。

var pluginDirectory = @"C:\....\xulrunner\");
var path = Environment.GetEnvironmentVariable("path");
Environment.SetEnvironmentVariable(
    "path", 
    pluginDirectory + ";" + path, 
    EnvironmentVariableTarget.Process);

关于c# - SetEnvironmentVariable 不更改 PATH 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11079709/

相关文章:

c# - Asp.net 图表,如何将 X 轴标签位置设置为左对齐而不是居中?

c# - Outlook Exchange 帐户仅发送 5 条消息

c# - 将 JSON 反序列化为 C# 动态对象?

C# Windows 窗体 : Looping through Dynamically created TextBoxes and checking to see if Text has changed

browser - 使用 XULRunner 的嵌入式浏览器

javascript - XPCOM 中的 popen 等价物?

css - 如何将 CSS 样式表应用于 XULRunner 中的所有页面 View

c# - 通过 C# 递归通知子控件

graphics - 构建轻量级跨平台文本编辑器的方法