来自 PHP 的类未注册错误
本文关键字:注册 错误 PHP 来自 | 更新日期: 2023-09-27 18:36:30
我们创建了一个 C# 类库程序集,并使其可见,以便能够从 PHP 调用其方法。这曾经工作正常,但现在我们想将其安装在Windows Server 2008服务器上,并且我们不断遇到错误"类未注册"。
为了排除任何依赖问题,我用 C# 做了一个小的测试类库。该类库是为任何 CPU 构建的,它是 COM 可见的(在 AssemblyInfo.cs 中也设置 COMVisible 为 true)。测试类库仅包含一个具有一个方法的类。该类称为 TestLib,命名空间也称为 TestLib。该方法称为 Test,仅返回一个字符串。
我们所做的如下:- 构建了测试库.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 安装在服务器上。
有什么想法吗?
好的,经过更多的研究,我想通了。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 项中的注册表项不是由 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
希望这可以节省其他人一些时间和头痛。
如果您尝试在 64 位 Windows 上调用32-bit COM DLL
,则需要注册它。
- 将 32 位 DLL 复制到 C:''Windows''sysWOW64
- 运行
C:'Windows'sysWOW64'regsvr32.exe your_com_32.dll
通过屏幕截图提供更多信息。