3

Se7enSoftのMozNetプラグインを使用しています。これはFireFox3.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. Windowsディレクトリ
  5. カレントディレクトリ
  6. PATH環境変数のディレクトリ。

問題が発生した3台のPCが判明し、別の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);
于 2012-06-18T13:10:42.607 に答える
0

はい、set environment Variableの使用に問題があります。現在のプロセスに対して、指定された環境変数の内容を設定するだけです。変数には影響しません。

説明については、次の例をお読みください。

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

この関数は、システム環境変数または他のプロセスの環境変数には影響しません。

于 2012-06-18T09:19:32.033 に答える