从源代码构建 TagLib# DLL 并使其对 PHP COM 可见
Build TagLib# DLL from source and make it COM Visible to PHP
您好,我想扫描音视频文件并使用 php 将其元数据存储在数据库中。我发现这个 Command-line wrapper that uses TagLib.dll compiled by banshee developpers 可以完成这项工作。它工作正常,但受实现的功能限制。我想通过 PHP.
直接访问 dll 方法
在 PHP 中,我们有一个函数 (DOTNET),它允许我从 .Net 程序集实例化 class 并调用其方法并访问其属性,如下所示:
/*$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";
这里是the Taglib# project sources in github
我看到很多关于 PHP-DLL-COM 的问题,有一些建议:
- 使 dll 可见;
- 使用
regsvr32
; 注册 dll
- 使用类似于
的模块定义文件
;
;
DESCRIPTION "Simple COM object"
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
我的问题是:如何构建 DLL 并通过 PHP 使用其方法?
我的配置 :
OS
Windows Server 2012 R2 Standard Edition i586
阿帕奇:
Apache/2.2.21 (Win32) DAV/2 PHP/5.4.42 mod_ssl/2.2.21 OpenSSL/0.9.8r
PHP
PHP Version : 5.4.42
Arch : x86
Compiler : MSVC9 (Visual C++ 2008)
COM support : enabled
DCOM support : disabled
.Net support enabled
微软 Visual Studio 2013
尝试以下步骤:
- 从 github
下载 taglib 源代码
- 从 .csproj 文件中删除 ApplicationIcon 标记并在 Visual Studio
中打开 .sln
- 卸载测试项目(你不需要构建它)
- 右键单击 taglib-sharp 项目 --> 属性 --> 构建 --> 启用 'Register for COM interop'。同时清除条件编译符号文本框,这样您现在就不必为下载 SharpZipLib 而烦恼了。
- 观察 #1:在项目属性 --> 应用程序 --> 程序集信息 --> 'Make assembly COM visible' 中检查
- 注意 #2:在项目属性 --> 应用程序 --> 目标框架中设置为 3.5(确保保持原样)
- 构建项目 (F6)
- 阅读输出的内容window以查看一些警告
现在您有了 src\taglib-sharp.dll,您需要将它注册到全局程序集缓存中以便 DOTNET class 找到它。如果您对此不熟悉,请参阅 PHP DOTNET hell 了解详细信息。
如果一切顺利,你可以自己弄一份SharpZipLib,然后重新进入HAVE_SHARPZIPLIB条件编译符号-->重建-->重新部署到GAC-->做一个快乐的人! :)
如果没有,您可以使用 .NET Framework 3.5 编译 DLL,PHP 无法通过 DOTNET 加载它 class。
您好,我想扫描音视频文件并使用 php 将其元数据存储在数据库中。我发现这个 Command-line wrapper that uses TagLib.dll compiled by banshee developpers 可以完成这项工作。它工作正常,但受实现的功能限制。我想通过 PHP.
直接访问 dll 方法在 PHP 中,我们有一个函数 (DOTNET),它允许我从 .Net 程序集实例化 class 并调用其方法并访问其属性,如下所示:
/*$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";
这里是the Taglib# project sources in github
我看到很多关于 PHP-DLL-COM 的问题,有一些建议:
- 使 dll 可见;
- 使用
regsvr32
; 注册 dll
- 使用类似于 的模块定义文件
;
;
DESCRIPTION "Simple COM object"
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
我的问题是:如何构建 DLL 并通过 PHP 使用其方法?
我的配置 :
OS
Windows Server 2012 R2 Standard Edition i586
阿帕奇:
Apache/2.2.21 (Win32) DAV/2 PHP/5.4.42 mod_ssl/2.2.21 OpenSSL/0.9.8r
PHP
PHP Version : 5.4.42
Arch : x86
Compiler : MSVC9 (Visual C++ 2008)
COM support : enabled
DCOM support : disabled
.Net support enabled微软 Visual Studio 2013
尝试以下步骤:
- 从 github 下载 taglib 源代码
- 从 .csproj 文件中删除 ApplicationIcon 标记并在 Visual Studio 中打开 .sln
- 卸载测试项目(你不需要构建它)
- 右键单击 taglib-sharp 项目 --> 属性 --> 构建 --> 启用 'Register for COM interop'。同时清除条件编译符号文本框,这样您现在就不必为下载 SharpZipLib 而烦恼了。
- 观察 #1:在项目属性 --> 应用程序 --> 程序集信息 --> 'Make assembly COM visible' 中检查
- 注意 #2:在项目属性 --> 应用程序 --> 目标框架中设置为 3.5(确保保持原样)
- 构建项目 (F6)
- 阅读输出的内容window以查看一些警告
现在您有了 src\taglib-sharp.dll,您需要将它注册到全局程序集缓存中以便 DOTNET class 找到它。如果您对此不熟悉,请参阅 PHP DOTNET hell 了解详细信息。
如果一切顺利,你可以自己弄一份SharpZipLib,然后重新进入HAVE_SHARPZIPLIB条件编译符号-->重建-->重新部署到GAC-->做一个快乐的人! :)
如果没有,您可以使用 .NET Framework 3.5 编译 DLL,PHP 无法通过 DOTNET 加载它 class。