Мы создали сборку библиотеки классов 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()); }
Я также попытался добавить TestLib в GAC, используя gacutil -i, но безрезультатно; еще не зарегистрированная ошибка класса.
Затем я попытался скомпилировать тестовую библиотеку с .NET 2.0 вместо 4.0 в качестве целевой структуры, такой же результат. Кстати, .NET Framework 4.0 установлен на сервере.
Есть идеи?
Хорошо, поэтому после нескольких исследований я понял это. Процесс php.exe – 32 бит. COM-видимая сборка скомпилирована для любого CPU, поэтому она должна быть доступна как для 32, так и для 64-битных приложений.
Проблема заключается в том, что на 64-битной ОС php.exe и любом 32-разрядном процессе, в этом случае, выполняется поиск в HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID вместо HKEY_CLASSES_ROOT \ CLSID и в HKEY_LOCAL_MACHINE \ Software \ Classes \ Wow6432Node \ CLSID вместо HKEY_LOCAL_MACHINE \ Software \ 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, вам необходимо ее зарегистрировать.
C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll
Немного больше информации со скриншотами .