2016-01-18 1 views
1

Я перемещаю три Windows Services (.NET 3.5) из Windows Server 2003R2 в Windows Server 2012 R2 (.NET 4.5).C#, не читающий значения реестра из Wow6432Node в Windows Server 2012 64-разрядные

Первые два прошли хорошо. Чтение настроек реестра с [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ MyCompany \ MyApplication].

Теперь here's забавный материал - третий работает только тогда, когда я храню настройки в [HKEY_LOCAL_MACHINE \ SOFTWARE \ MyCompany \ MyApplication] (whitout Wow6432Node)?

И, если я пытаюсь запустить службу с настройками в 32-битном регистре считывает параметры в порядке, но я получаю эту ошибку привязки сборки вместо: System.BadImageFormatException: Не удалось загрузить файл или сборку «Oracle.DataAccess , Version = 4.121.2.0, Culture = neutral, PublicKeyToken = 89b483f429c47342 'или одна из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом. Остальные два, используя одну и ту же DLL, отлично работают.

Любые идеи? Что в третьей службе Windows отличается?

Поскольку все приложения используют тот же код для чтения реестра, я не думаю, что это проблема. Ее код (простое) в любом случае.

private string getRegistrySetting(string keyName) 
    { 
     string softwareSubkeyName = "SOFTWARE"; 
     using (RegistryKey softwareSubkey = Registry.LocalMachine.OpenSubKey(softwareSubkeyName, false)) 
     { 
      string lmSubkeyName = "MyCompany\\MyApplication; 
      using (RegistryKey lmSubkey = softwareSubkey.OpenSubKey(lmSubkeyName)) 
      { 
       return lmSubkey.GetValue(keyName).ToString(); 
      } 
     } 
    } 
+0

построить службу с помощью x86 и проверить ... –

ответ

1

Во-первых, вы должны убедиться, что все ваши исполняемые файлы имеют целевой платформы набор для x86 (а не AnyCPU) на вкладке сборки страниц свойств проекта (предостережение: это Build- за конфигурации, вам нужно установить целевую платформу для сборки Debug и Release).

Тогда вам нужно также установить 32-разрядную версию любых сторонних компонентов, таких как Oracle.DataAccess. Причина в том, что 32-разрядный процесс не может загрузить 64-разрядную dll и наоборот.

Целевая платформа релевантна, поскольку она определяет, будет ли ваш процесс запущен как 32-разрядный или 64-разрядный процесс. Если ваш исполняемый файл работает как 64-разрядный процесс, перенаправление реестра и файловой системы не будет на месте - в результате ваш процесс будет читать и записывать напрямую в HKEY_LOCAL_MACHINE\SOFTWARE\, а не в поднабор Wow6432Node.

+0

Спасибо. Я пробовал конфигурацию сборки. Исполняемый файл проекта имеет целевую платформу x86, а библиотеки проектов имеют «Любой процессор» во всех конфигурациях. Я снова восстановил все это и установил его. Не повезло. –

+0

Я также проверил Oracle.DataAccess.dll. Это та же самая dll, что и в двух других проектах. 32-бит v. 4.121.2.0, runtime v4.0.30319. Конкретная версия = False. –

+0

Работает ли ваш сервис как 32-разрядный или как 64-битный процесс? Вы можете проверить это, например. используя Process Explorer (дважды щелкните по сервису и проверьте на вкладке * Image *, он скажет либо «Изображение: 64-бит», либо «Изображение: 32-бит»). –

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

  • Нет связанных вопросов^_^