c# - 从源代码构建 TagLib# DLL 并使其 COM 对 PHP 可见

标签 c# php windows dll taglib-sharp

您好,我想使用 php 扫描音频-视频文件并将其元数据存储在数据库中。我找到了这个 Command-line wrapper使用 TagLib.dll compiled by banshee developpers做这项工作。它工作正常,但受实现的功能限制。我想通过 PHP 直接访问 dll 方法。

在 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";

这是 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 使用其方法?

我的配置:

  • 操作系统

    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 Version : 5.4.42
    Arch : x86
    Compiler : MSVC9 (Visual C++ 2008)
    COM support : enabled
    DCOM support : disabled
    .Net support enabled

  • 微软 Visual Studio 2013

最佳答案

尝试以下步骤:

  1. 从github下载taglib源码
  2. 从 .csproj 文件中删除 ApplicationIcon 标记并在 Visual Studio 中打开 .sln
  3. 卸载测试项目(你不需要构建它)
  4. 右键单击 taglib-sharp 项目 --> 属性 --> 构建 --> 启用“注册 COM 互操作”。同时清除条件编译符号文本框,这样您现在就不必费心下载 SharpZipLib。
  5. 观察 #1:在项目属性 --> 应用程序 --> 程序集信息 --> 选中“使程序集 COM 可见”
  6. 注意 #2:在项目属性 --> 应用程序 --> 目标框架中设置为 3.5(确保保持原样)
  7. 构建项目 (F6)
  8. 阅读输出窗口的内容以查看一些警告

现在您有了 src\taglib-sharp.dll,您需要将它注册到全局程序集缓存中,以便 DOTNET 类找到它。见 PHP DOTNET hell如果您对此不熟悉,请了解详细信息。

如果一切顺利,你可以给自己弄一份 SharpZipLib,然后重新输入 HAVE_SHARPZIPLIB 条件编译符号 --> 重建 --> 重新部署到 GAC --> 做一个快乐的人! :)

关于c# - 从源代码构建 TagLib# DLL 并使其 COM 对 PHP 可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478746/

相关文章:

php - 来自 CLI 的 Codeigniter cron 作业抛出 memcached 错误

php - 根据另一个表字段值过滤 mysql 数组输出

编译的 c 脚本只保持打开状态几分之一秒

C# AsyncEnumerable 运行/等待多个任务永远不会完成

c# - C# 中 azure 的组合缓存提供程序

php - 如何在1个项目中拥有2个composer.json文件?

c++ - 如何获取 GPU 信息?

c++ - 在 C++ 中将文本附加到 Win32 EditBox

c# - 从 IntPtr 句柄获取控件/表单对象

c# - 在来自 Resources.resx 的 xaml 中使用图像