Построить TagLib # DLL из исходного кода и сделать его COM видимым для PHP

Здравствуйте, я хочу сканировать аудио-видео файлы и хранить их метаданные в базе данных с помощью php. Я нашел эту оболочку командной строки, которая использует TagLib.dll, скомпилированную разработчиками banshee для выполнения этой задачи. Он отлично работает, но ограничивается реализованными функциями. Я хочу получить доступ непосредственно к dll-методам через PHP.

В PHP у нас есть функция (DOTNET), которая позволяет мне создать экземпляр класса из сборки .Net и вызвать его методы и получить доступ к его свойствам, подобным этому

/*$obj = new DOTNET("assembly", "classname");*/  

$stack = new DOTNET("mscorlib", "System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Hello ");
echo $stack->Pop() . $stack->Pop();

//Returns string(10) "Hello .Net";

Здесь источники проекта Taglib # в github

Я видел много вопросов родственников для PHP-DLL-COM и есть несколько рекомендаций:

  • Сделать dll comVisible;
  • Зарегистрируйте dll с помощью regsvr32;
  • Используйте файл определения модуля, похожий на

;

;

DESCRIPTION     "Simple COM object"

EXPORTS
                DllGetClassObject       PRIVATE
                DllCanUnloadNow         PRIVATE
                DllRegisterServer       PRIVATE
                DllUnregisterServer     PRIVATE

Мой вопрос: Как я могу создать DLL и использовать его метод через PHP?

Моя конфигурация:

  • OS

    Windows Server 2012 R2 Standard Edition i586

  • Apache:

    Apache/2.2.21 (Win32) DAV/2 PHP/5.4.42 mod_ssl/2.2.21 OpenSSL/0.9.8r

  • PHP

    Версия PHP: 5.4.42
    Arch: x86
    Компилятор: MSVC9 (Visual С++ 2008)
    Поддержка COM: включен Поддержка DCOM: отключена
    Поддержка .Net

  • Microsoft Visual Studio 2013

Ответы

Ответ 1

Попробуйте выполнить следующие шаги:

  • Загрузите исходный код taglib из github
  • Удалить тег ApplicationIcon из файла .csproj и открыть .sln в Visual Studio
  • Разгрузите тестовый проект (вам не нужно его создавать)
  • Щелкните правой кнопкой мыши на проекте taglib-sharp → properties → build → enable 'Register for COM interop'. Также очистите текстовое поле условных компиляций, чтобы вам не пришлось беспокоиться о загрузке SharpZipLib.
  • Наблюдать # 1: в свойствах проекта → Приложение → Информация о сборке → 'Сделать сборку COM видимым' отмечен
  • Соблюдайте # 2: в свойствах проекта → Приложение → целевая структура установлена ​​на 3.5 (убедитесь, что вы оставите ее как таковой)
  • Постройте проект (F6)
  • Прочитайте содержимое окна вывода, чтобы увидеть некоторые предупреждения

Теперь, когда у вас есть src\taglib-sharp.dll, вам необходимо зарегистрировать его в глобальном кеше сборок, чтобы класс DOTNET смог его найти. Подробнее см. PHP DOTNET hell, если вы не знакомы с этим.

Если все хорошо, вы можете получить копию SharpZipLib и повторно ввести символ условной компиляции HAVE_SHARPZIPLIB → rebuild → передислоцировать в GAC → и стать счастливым человеком!:)

Ответ 2

Вы можете скомпилировать DLL с .NET Framework 3.5, если нет, PHP не сможет загрузить его через класс DOTNET.

Загрузить .NET 3.5