C# SetEnvironmentVariable未更改路径变量

C# SetEnvironmentVariable未更改路径变量,c#,xulrunner,C#,Xulrunner,我正在使用Se7enSoft的MozNet插件。这是一个适用于FireFox 3.6的WebBrowser控件。它使用XulRunner 我必须做的第一件事是执行Initialize(…)方法 我必须将安装XulRunner的目录传递给它。 该插件的Initialize方法在内部使用以下DLLImport [DllImport("xpcom", CharSet = CharSet.Ansi, EntryPoint = "NS_CStringContainerFinish"

我正在使用Se7enSoft的MozNet插件。这是一个适用于FireFox 3.6的WebBrowser控件。它使用XulRunner

我必须做的第一件事是执行Initialize(…)方法

我必须将安装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);
var pluginDirectory = @"C:\....\xulrunner\");
var path = Environment.GetEnvironmentVariable("path");
Environment.SetEnvironmentVariable(
    "path", 
    pluginDirectory + ";" + path, 
    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台电脑(Windows 2000和XP)上发生。对其他数百人来说效果很好

如果我调试并跳过Environment.SetEnvironmentVariable(…)方法,我可以重现这个问题


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

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

Environment.SetEnvironmentVariable("path", 
    Environment.GetEnvironmentVariable("path") + ";" + 
    binDirectory, EnvironmentVariableTarget.Process);
var pluginDirectory = @"C:\....\xulrunner\");
var path = Environment.GetEnvironmentVariable("path");
Environment.SetEnvironmentVariable(
    "path", 
    pluginDirectory + ";" + path, 
    EnvironmentVariableTarget.Process);
请阅读下面的例子进行解释

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

找到了原因

DLLImport语句使用自动查找xpcom.dll文件

简而言之,它搜索:

  • 安装应用程序的目录
  • 系统目录
  • 16位系统目录
  • Windows目录
  • 当前目录
  • PATH环境变量中的目录
  • 结果发现有问题的3台电脑上有一个不同的xpcom.dll。这是第一个被发现的,大量的例外

    path环境变量中列出的目录(UNC path)指向xpcom.dll依赖的两个dll,即:

    • nspr4.dll
    • nss3.dll
    • plc4.dll
    • plds4.dll
    我们只通过更改流程的PATH变量来修复它。通过将我们的路径添加到path环境变量的开头,确保在搜索其他路径之前搜索我们的路径

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

    您正在使用漫游配置文件吗?可能是。通常不会,但我们以前有人使用了不正确的(漫游配置文件)。检查一下,好的。报告此问题的用户没有漫游配置文件。在运行.NET3.5的VB项目中,您仍然推荐MozNET吗?他们的网站上似乎有大量链接被破坏,包括文档。在谷歌将我连接到这里的一个帖子后,我试图在他们的论坛上注册,但似乎最后一个合法帖子是在2012年?我不知道现在该如何使用MozNet…不,我不会用它。它只由一个人维护IIRC。从那时起,我们已经删除了MozNET。从那时起,我们在CefSharp()的帮助下改用铬。我知道。我只想为当前流程更改它。它只是没有注意到当前进程的更改。您是否在管理员权限下运行该应用程序?在哪个操作系统中运行?Win2000、XP和7。仅在3台电脑上报告(2x 2000和1x XP)。管理员权限。不可以。请使用管理员权限运行该应用程序并将其签出。还可以检查SetEnvironmentVariable方法的返回值