php無法呼叫com元件的解決方法:1、確認php版本以及所需系統工具;2、設定php.ini,開啟「com.allow_dcom = true」;3、開啟php的com功能或者檢查“php_com_dotnet.dll”是否載入成功即可。
本教學操作環境:windows7系統、PHP8.1版、Dell G3電腦。
php無法呼叫com元件怎麼辦? php引用COM組件踩坑記錄
最近工作事項中出現一項“零工”,要在已有的php工程中增加一項功能,而且工程以及所需要實現功能的源代碼工程也都有,本是一件很容易的事。雖然我鮮少用到php,不過這不是最重要的“限制因素”,讓我頭疼的是,功能庫部分是用.NET框架實現的,裡面有很多對數據格式的調整,相對比較複雜,沒有功能邏輯手冊,很難在php中複寫一份。所以要在php中直接引用.NET的動態函式庫就成了完成「任務」的關鍵
網路上很多前輩記錄了這個問題,但照葫蘆畫瓢未能成功,本文就是在「肝零工「的過程中,遇到並填坑的記錄
產生COM元件動態庫
COM component(COM元件)是微軟開發的軟體開發技術。其實質是一些小的二進制可執行程序,它們可以給應用程序,操作系統以及其他組件提供服務。而在php中如果想要引用第三方動態函式庫,則需要透過new COM("Component.class") 的方法來實現,其中的Component 必須是COM元件
#1. 建構Windows類別庫專案
無論是哪個版本的Framework,應該都能夠在Windows標籤下找到類別庫項目
這樣工程中預設會有Properties\AssemblyInfo.cs 文件,裡面記錄了項目集所需的訊息
2. 目標框架要符合
建立專案的時候可以對Framework進行選擇
如果是後製調整,可在工程屬性> 應用程式中的目標框架中進行修改
注意,需要於後期註冊dll的時候的框架保持一致
#3. 設定COM元件可見
在Properties\AssemblyInfo.cs 檔案中,將ComVisible 進行如下修改
[assembly: ComVisible(true)]
4. 若要設定簽名並設定強名稱金鑰
工程屬性> 簽章中,勾選「為程式集簽署」 ,同時在下方「選擇強名稱金鑰檔案」 中新建金鑰檔案
然後生成,在bin\Debug 目錄下找到對應的dll 檔案
#5. 如果存在無法嵌入的動態函式庫
假如工程Framework版本較低,或者,
引用的函式庫缺少互通所需特性,
總之,無法對引用函式庫進行嵌入互通
那麼,依賴的dll,也需要執行後續的註冊等操作
將DLL註冊到伺服器上
涉及到系統級的操作,坑甚多…
1.確認php版本
親測5.3.22版本不可用,5.4.5版本可用,所以盡可能採用5.4以上版本
現在php最高是8.0版了,不知道是否還是一樣的操作方法
2. 確認所需系統工具
需要gacutil 和regasm 兩種工具,而且都需要是符合Framework版本的
也就是說產生的COM元件的dll用的是哪個版本的框架,這裡也需要用對應版本的工具進行
通常情況下windows系統肯定會內建regasm 工具
目錄路徑例如,
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe
如果是套用於64位元系統,則在Framework64 目錄下,否則用Framework 目錄下,選擇對應Framework框架的版本號,其中應該能找到RegAsm.exe 檔案
#gacutil 工具在微軟提供的windows sdk 中有,如果沒安裝過,可點選到官網下載
預設安裝後,Frameworkd4.0以下版本的工具路徑,
C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\gacutil.exe
如果需要4.0的版本,路徑是,
c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\gacutil.exe
3. 設定php.ini
開com.allow_dcom = true
確保你的extension_dir 目錄中有php_com_dotnet.dll 檔案
#開啟或新增extension=php_com_dotnet.dll
4. 快取和註冊DLL
以64位元系統,4.0版本的my.dll為例
#將第一趴中產生的dll,複製到c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\ 目錄中
到目錄c:\Program Files\Microsoft SDKs\Windows\v7 .1\Bin\NETFX 4.0 Tools\ 下執行gacutil /i my.dll
到目錄C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ 下執行regasm my.dll
5. 註銷DLL
以64位元系統,4.0版本的my.dll為例
到目錄C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ 下執行regasm my.dll /unregister
到目錄c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\ 下執行gacutil /u my
php調用COM元件
以上內容都配置無誤以後,就可以在php檔案中進行調用,方法如下,
$comClass = new COM('namespace.className'); $comClass -> methodName();
提示沒有COM方法,則需要考慮是否已開啟了php的com功能,或者php_com_dotnet.dll是否載入成功
提示沒有呼叫的dll的方法,或者dll未註冊,則需要考慮是否dll檔案已經註冊成功
推薦學習:《PHP視訊教學》
以上是php無法呼叫com元件怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!