2012-06-07 76 views
4

我們創建了一個C#類庫程序集,並使其可以從PHP調用其方法。這用於正常工作,但現在我們希望將它安裝在Windows Server 2008服務器上,並且我們繼續步入錯誤「Class not registered」。類未註冊錯誤來自PHP

爲了排除任何依賴性問題,我在C#中創建了一個小小的測試類庫。類庫是爲任何CPU構建的,並且它是COM可見的(在AssemblyInfo.cs中也將COMVisible設置爲true)。測試類庫僅包含一個具有一個方法的類。該類稱爲TestLib,名稱空間也稱爲TestLib。該方法被稱爲Test,並且只返回一個字符串。

我們所做的是: - 建成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,但無濟於事;還是班級沒有註冊錯誤。

然後我試着用.NET 2.0而不是4.0編譯testlibrary作爲目標框架,結果相同。順便說一句,.NET框架4.0安裝在服務器上。

任何想法?

回答

2

好的,經過一些更多的研究之後,我發現了它。 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 2.0創建一個小測試程序集並註冊它與.NET Framework 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

希望這樣可以節省別人一些時間和頭痛。

0

如果您嘗試在64位Windows上調用32-bit COM DLL,則需要註冊它。

  1. 您的32位DLL複製到C:\ WINDOWS \ SYSWOW64
  2. 運行C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll

有點more info with screenshots