Класс не зарегистрированная ошибка из PHP

Мы создали сборку библиотеки классов C# и сделали ее видимой для COM, чтобы иметь возможность вызывать ее методы из PHP. Раньше это работало нормально, но теперь мы хотели установить его на сервер Windows Server 2008, и мы продолжаем сталкиваться с ошибкой "Класс не зарегистрирован".

Чтобы исключить любые проблемы с зависимостями, я сделал небольшую тестовую библиотеку классов на C#. Библиотека классов построена для любого процессора и является видимой для COM (также установите для COMVisible значение true в AssemblyInfo.cs). Библиотека тестовых классов содержит только один класс с одним методом. Класс называется TestLib, а пространство имен также называется TestLib. Метод называется Test и возвращает только строку.

Мы сделали следующее: - построили TestLib.dll - скопировали его на компьютер с Windows Server 2008 - зарегистрировали dll с помощью: regasm /codebase TestLib.dll - инструмент regasm возвращает сообщение об успехе - в PHP мы просто пытаемся создайте новый экземпляр COM:

try
{
   $test = new COM("TestLib.TestLib");
}
catch (Exception $e)
{
   die($e->getMessage());
}
  • когда мы вызываем этот тестовый скрипт из браузера или из командной строки (php -f test.php), мы получаем ошибку "Класс не зарегистрирован" в обоих случаях

Я также попытался добавить TestLib в GAC, используя gacutil -i, но безрезультатно; еще класс не зарегистрированная ошибка.

Затем я попытался скомпилировать тестовую библиотеку с.NET 2.0 вместо 4.0 в качестве целевой платформы, тот же результат. Кстати,.NET Framework 4.0 установлен на сервере.

Есть идеи?

2 ответа

Решение

Хорошо, после некоторого исследования я понял это. Процесс php.exe является 32-разрядным. Видимая сборка COM скомпилирована для любого процессора, поэтому она должна быть доступна как для 32-, так и для 64-битных приложений.

Проблема заключается в том, что в 64-битной ОС php.exe и любом 32-битном процессе поиск выполняется в HKEY_CLASSES_ROOT\Wow6432Node\CLSID вместо HKEY_CLASSES_ROOT\CLSID и в HKEY_LOCAL_MACHINE\Software\Classes\Wow6432Node\CLSID_HLK_K вместо HK \Classes\CLSID. Записи реестра в ключах Wow6432 не создаются программой regasm, которая поставляется с.NET Framework v4 на Windows Server 2008. В Windows 7 они создаются, не спрашивайте меня, почему.

Также оказалось, что если я создаю небольшую тестовую сборку для.NET v2.0 и регистрирую ее с помощью regasm, поставляемой с.NET Framework v2.0, то это создает записи Wow6432Node в Windows 2008. Странно.

Таким образом, мое решение состоит в том, чтобы создать основной файл реестра на сервере, используя:

regasm /regfile MyClassLib.dll

Это создает файл MyClassLib.reg только с "обычными" 64-битными записями. Затем я экспортировал ключи Wow6432Node с компьютера с Windows 7 и добавил его в этот файл.reg. Теперь, когда я импортирую этот reg файл в реестр в Windows 2008, все работает нормально.

Дополнительную информацию о записях Wow6432Node можно получить по адресу: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx

Надеюсь, это сэкономит кому-то еще время и головные боли.

Если вы пытаетесь позвонить 32-bit COM DLL на 64-битной Windows вам нужно будет это зарегистрировать.

  1. Скопируйте 32-битную DLL в C:\Windows\sysWOW64
  2. Бежать C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll

Немного больше информации со скриншотами.

Другие вопросы по тегам