4

我们创建了一个 C# 类库程序集并使其 COM 可见,以便能够从 PHP 调用其方法。这曾经可以正常工作,但现在我们想将它安装在 Windows Server 2008 服务器上,并且我们一直遇到错误“类未注册”。

为了排除任何依赖问题,我在 C# 中制作了一个很小的测试类库。类库是为任何 CPU 构建的,它是 COM 可见的(在 AssemblyInfo.cs 中也将 COMVisible 设置为 true)。测试类库只包含一个类和一种方法。该类称为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) 调用此测试脚本时,在这两种情况下都会出现错误“未注册类”

我还尝试使用 gacutil -i 将 TestLib 添加到 GAC,但无济于事;仍然类未注册错误。

然后我尝试使用 .NET 2.0 而不是 4.0 作为目标框架编译测试库,结果相同。.NET framework 4.0 顺便安装在服务器上。

有任何想法吗?

4

2 回答 2

3

好的,所以经过更多研究后,我想通了。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 \类\CLSID。Wow6432 键中的注册表项不是由 Windows Server 2008 上的 .NET framework v4 附带的 regasm 创建的。在 Windows 7 上它们是创建的,不要问我为什么。

事实证明,如果我为 .NET v2.0 创建一个小测试程序集并将其注册到 .NET framework v2.0 附带的 regasm 中,它确实会在 Windows 2008 上创建 Wow6432Node 条目。奇怪。

所以我的解决方案是在服务器上创建一个基本的注册表文件:

regasm /regfile MyClassLib.dll

这将创建一个 MyClassLib.reg 文件,其中只有“正常”64 位条目。然后我从 Windows 7 机器导出 Wow6432Node 密钥并将其添加到该 .reg 文件中。现在,当我将该 reg 文件导入 Windows 2008 上的注册表时,一切正常。

有关 Wow6432Node 条目的更多信息,请查看:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx

希望这可以节省其他人一些时间和头痛。

于 2012-06-08T09:37:25.143 回答
0

如果您尝试32-bit COM DLL在 64 位 Windows 上调用,则需要注册它。

  1. 将 32 位 DLL 复制到 C:\Windows\sysWOW64
  2. C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll

更多信息与截图

于 2014-08-28T06:06:33.653 回答