3

我正在使用 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 环境变量?

4

2 回答 2

5

找到了原因。

DLLImport 语句使用动态链接库搜索顺序自动定位 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. 视窗目录
  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);
于 2012-06-18T13:10:42.607 回答
0

是的,使用设置环境变量有问题,它只是为当前进程设置指定环境变量的内容,不会对变量产生影响。

请阅读以下示例进行说明。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx

该函数对系统环境变量或其他进程的环境变量没有影响。

于 2012-06-18T09:19:32.033 回答