没有注册类从PHP错误(Class not registered error from PHP)

2019-09-17 20:44发布

我们已经创建了一个C#类库组件,并使其COM可见能够从PHP调用它的方法。 这用来做工精细,但现在我们想在Windows Server 2008服务器上安装它,我们不断走进错误“未注册类”。

为了排除任何依赖问题我提出在C#中一个小小的测试类库。 该类库是专为任何CPU,它是COM可见(也AssemblyInfo.cs中设置标记有ComVisible特性为true)。 测试类库只包含一个方法,一个类。 该类称为TESTLIB和命名空间也被称为TESTLIB。 该方法被称为测试,只返回一个字符串。

我们所做的是以下几点: - 建成TestLib.dll - 它复制到Windows Server 2008的计算机 - 注册的dll有:regasm /基本代码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,但无济于事; 仍然类没有注册的错误。

然后我试图编译testlibrary与.NET 2.0,而不是4.0作为目标框架,同样的结果。 在.NET框架4.0安装的方式在服务器上。

有任何想法吗?

Answer 1:

好了,经过一些调查研究我想通了。 所述的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。 不被随机附带.NET框架v4的Windows Server 2008上在Windows 7创建它们regasm创造了Wow6432键的注册表项,不要问我为什么。

这也证明了,如果我创建.NET v2.0的一个小的测试组件,并与regasm注册它附带.NET框架2.0版,它并创建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

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



Answer 2:

如果你试图调用32-bit COM DLL在64位的Windows,你需要注册。

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

有点用截图的详细信息 。



文章来源: Class not registered error from PHP