2012-06-18 4 views
3

Я использую плагин MozNet от Se7enSoft. Это элемент управления WebBrowser для FireFox 3.6. Он использует XulRunner.SetEnvironmentVariable не меняет переменную PATH

Первое, что мне нужно сделать, это выполнить метод 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); 

Метод NS_CStringContainerFinish из xpcom.dll в XULRunner является требуется.

Незадолго до того, как этот метод вызывается в первый раз, плагин 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 ПК (Windows 2000 & XP). Прекрасно работает для сотен других.

Я могу воспроизвести проблему, если я отлаживаю и перехожу к методу Environment.SetEnvironmentVariable (...).

Есть ли проблемы с SetEnvironmentVariable, которые могут помешать изменению переменной среды PATH?

+0

Вы используете перемещаемые профили? –

+0

Может быть. Обычно нет, но раньше у нас были люди с некорректными (роуминг-профилями). Проверка в нем. –

+0

ОК. Пользователи, сообщившие о проблеме, не имеют перемещаемых профилей. –

ответ

4

Обнаружена причина.

Оператор DLLImport автоматически находит файл xpcom.dll с помощью dynamic link library search order.

[DllImport("xpcom", CharSet = CharSet.Ansi, 
      EntryPoint = "NS_CStringContainerFinish", 
      CallingConvention = CallingConvention.Cdecl)] 
internal static extern int Moz_CStringContainerFinish(ACString container); 

Короче говоря, он ищет:

  1. каталога, в котором установлено приложение.
  2. каталог System
  3. 16-битовые системный каталог каталог
  4. Окна
  5. Текущий каталог
  6. Каталоги в переменной PATH среды.

Оказалось, что у 3 компьютеров, у которых была проблема, была другая xpcom.dll, которая задерживалась. Сначала это было найдено, а BOOM ... исключения в изобилии.

Каталог (UNC-путь), перечисленных в переменной PATH среды указывает на пару библиотек 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); 
0

Да, существует проблема с использованием среды установки Variable, она просто устанавливает содержимое указанной переменной среды для текущего процесса. Это не повлияет на переменную.

Пожалуйста, ознакомьтесь с приведенным ниже примером.

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

Эта функция не оказывает никакого влияния на системных переменных среды или переменными среды других процессов.

+0

Я это знаю. Я хочу изменить его только для текущего процесса. Это просто не подходит для изменения текущего процесса. –

+0

Вы используете это приложение в административной привилегии? В какой операционной системе работает? –

+0

Win 2000, XP и 7. Сообщается только о трех ПК (2x 2000 и 1x XP). Административная привилегия. Неа. –

Смежные вопросы