我们已经创建了一个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安装的方式在服务器上。
有任何想法吗?
好了,经过一些调查研究我想通了。 所述的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
希望这样可以节省别人一些时间和头痛。
如果你试图调用32-bit COM DLL
在64位的Windows,你需要注册。
- 您的32位DLL复制到C:\ WINDOWS \ SYSWOW64
- 运行
C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll
有点用截图的详细信息 。