我使用的是 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);
简而言之,它搜索:
- 您的应用程序的安装目录。
- 系统目录
- 16位系统目录
- Windows目录
- 当前目录
- 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/