SetEnvironmentVariable不改变PATH变量

时间:2012-06-18 09:03:46

标签: 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环境变量的问题?

2 个答案:

答案 0 :(得分:5)

找到原因。

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环境变量中的目录。
  7. 原来有3台有问题的电脑,有不同的xpcom.dll徘徊不前。这是首先发现的,而BOOM ......例外情况很丰富。

    PATH环境变量中列出的目录(UNC路径)指向了几个与xpcom.dll相关的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);
    

答案 1 :(得分:0)

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

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

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

此功能对系统环境变量或其他进程的环境变量没有影响。