首頁 >後端開發 >PHP問題 >php無法呼叫com元件怎麼辦

php無法呼叫com元件怎麼辦

藏色散人
藏色散人原創
2022-11-01 10:04:512273瀏覽

php無法呼叫com元件的解決方法:1、確認php版本以及所需系統工具;2、設定php.ini,開啟「com.allow_dcom = true」;3、開啟php的com功能或者檢查“php_com_dotnet.dll”是否載入成功即可。

php無法呼叫com元件怎麼辦

本教學操作環境: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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn