来自PHP的类未注册错误

我们已经创建了一个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安装在服务器上。

有任何想法吗?

好的,经过一些更多的研究,我发现了它。 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上创建它们,不要问我原因。

事实certificate,如果我为.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

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

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

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

截图更多信息 。