来自PHP的类未注册错误

时间:2012-06-07 10:22:25

标签: c# php com comvisible

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

为了排除任何依赖性问题,我在C#中创建了一个小小的测试类库。类库是为Any 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)调用此测试脚本时,我们在两种情况下都会收到错误“Class not registered”

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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 \ Classes下\ CLSID。 Wow6432密钥中的注册表项不是由Windows Server 2008上的.NET Framework v4附带的regasm创建的。在Windows 7上创建它们,不要问我原因。

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

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

regasm /regfile MyClassLib.dll

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

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

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

答案 1 :(得分:0)

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

  1. 将32位DLL复制到C:\ Windows \ sysWOW64
  2. 运行C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll
  3. 有点more info with screenshots