2012-06-18 2 views
3

Se7enSoft의 MozNet 플러그인을 사용하고 있습니다. 이것은 FireFox 3.6 용 WebBrowser 컨트롤입니다. XulRunner를 사용합니다.SetEnvironmentVariable이 PATH 변수를 변경하지 않습니다.

내가해야 할 일은 초기화 (...) 메소드를 실행하는 것입니다.

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의 위치

일시적으로는 xpcom.dll (및 기타)를 해결할 수 있는지 확인하기 위해 PATH 환경 변수에 추가됩니다.

그러나 여전히 찾을 수 없습니다. 다음 예외가 발생합니다.

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의 (윈도우 2000 & XP)에서 발생합니다. 수백 명의 사람들에게 잘 작동합니다.

Debug 및 Environment.SetEnvironmentVariable (...) 메서드를 단계별로 실행하면 문제가 재현 될 수 있습니다.

PATH 환경 변수를 변경하지 못하게하는 SetEnvironmentVariable에 문제가 있습니까?

+0

로밍 프로필을 사용하고 있습니까? –

+0

수 있습니다. 일반적으로는 아니지만 이전에는 부정확 한 프로필 (로밍 프로필)이있었습니다. 그것으로 체크인. –

+0

확인. 문제를보고 한 사용자에게는 로밍 프로필이 없습니다. –

답변

4

원인을 찾으 셨습니다.

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. 응용 프로그램이 설치되어있는 디렉토리.PATH 환경 변수에
  2. 시스템 디렉토리
  3. 16 비트 시스템 디렉토리
  4. Windows 디렉터리
  5. 현재 디렉토리
  6. 디렉토리.

문제가있는 3 대의 PC가 밝혀졌고 다른 xpcom.dll이 남아있었습니다. 이것은 처음 발견되었고 붐 ... 예외가 많이 있습니다.

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); 
0

예, set environment 변수를 사용할 때 문제가 있습니다. 현재 환경 변수에 지정된 환경 변수의 내용 만 설정하면됩니다. 변수에 영향을 미치지 않습니다.

설명을 위해 다음 예제를 읽으십시오.

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

이 함수는 시스템 환경 변수 나 다른 프로세스의 환경 변수들에 영향을 미치지 않는다.

+0

나는 그것을 안다. 현재 프로세스에 대해서만 변경하려고합니다. 현재 프로세스에 대한 변경 사항을 파악하지 않고 있습니다. –

+0

관리자 privillege에서 해당 앱을 실행하고 있습니까? 실행중인 OS는 무엇입니까? –

+0

Win 2000, XP 및 7. 3 대의 PC에서만보고됩니다 (2x 2000 및 1x XP). 관리자 특권. 아니. –

관련 문제