溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php無法調(diào)用com組件如何解決

發(fā)布時間:2022-11-01 10:32:56 來源:億速云 閱讀:176 作者:iii 欄目:編程語言

本文小編為大家詳細(xì)介紹“php無法調(diào)用com組件如何解決”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“php無法調(diào)用com組件如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

php無法調(diào)用com組件的解決辦法:1、確認(rèn)php版本以及所需系統(tǒng)工具;2、配置php.ini,開啟“com.allow_dcom = true”;3、開啟php的com功能或者檢查“php_com_dotnet.dll”是否加載成功即可。

php無法調(diào)用com組件怎么辦?php引用COM組件踩坑記錄

最近工作事項中出現(xiàn)一項“零工”,要在已有的php工程中增加一項功能,而且工程以及所需要實現(xiàn)功能的源代碼工程也都有,本是一件很容易的事情。雖然我鮮少用到php,不過這不是最重要的“限制因素”,讓我頭疼的是,功能庫部分是用.NET框架實現(xiàn)的,里面有很多對數(shù)據(jù)格式的調(diào)整,相對比較復(fù)雜,沒有功能邏輯手冊,很難在php中復(fù)寫一份。所以要在php中直接引用.NET的動態(tài)庫就成了完成“任務(wù)”的關(guān)鍵

網(wǎng)上很多前輩記錄了這個問題,但照葫蘆畫瓢未能成功,本文就是在“肝零工”的過程中,遇到并填坑的記錄

生成COM組件動態(tài)庫

COM component(COM組件)是微軟開發(fā)的軟件開發(fā)技術(shù)。其實質(zhì)是一些小的二進(jìn)制可執(zhí)行程序,它們可以給應(yīng)用程序,操作系統(tǒng)以及其他組件提供服務(wù)。而在php中如果想要引用第三方動態(tài)庫,需要通過 new COM("Component.class") 的方法來實現(xiàn),其中的 Component 必須是COM組件

1. 構(gòu)建Windows類庫項目

無論是哪個版本的Framework,應(yīng)該都能夠在Windows標(biāo)簽下找到類庫項目

這樣工程中默認(rèn)會有 Properties\AssemblyInfo.cs 文件,里面記錄了項目集所需的信息

2. 目標(biāo)框架要匹配

創(chuàng)建項目的時候可以對Framework進(jìn)行選擇

如果是后期調(diào)整,可在工程屬性 > 應(yīng)用程序中的目標(biāo)框架中進(jìn)行修改

注意,需要于后期注冊dll的時候的框架保持一致

3. 設(shè)置COM組件可見

在 Properties\AssemblyInfo.cs 文件中,將 ComVisible 進(jìn)行如下修改

[assembly: ComVisible(true)]

4. 要設(shè)置簽名并設(shè)置強名稱密鑰

工程屬性 > 簽名中,勾選 “為程序集簽名” ,同時在下方 “選擇強名稱密鑰文件” 中新建密鑰文件

然后生成,在 bin\Debug 目錄下找到對應(yīng)的 dll 文件

5. 如果存在無法嵌入的動態(tài)庫

假如工程Framework版本較低,或者,

引用的庫缺少互操作所需特性,

總之,無法對引用庫進(jìn)行嵌入互操作

那么,依賴的dll,也需要執(zhí)行后續(xù)的注冊等操作

將DLL注冊到服務(wù)器

涉及到系統(tǒng)級的操作,坑甚多…

1. 確認(rèn)php版本

親測5.3.22版本不可用,5.4.5版本可用,所以盡可能采用5.4以上版本

現(xiàn)在php最高是8.0版了,不知道是否還是一樣的操作方法

2. 確認(rèn)所需系統(tǒng)工具

需要 gacutil 和 regasm 兩種工具,且都需要是 匹配Framework版本 的

也就是說生成的COM組件的dll用的是哪個版本的框架,此處也需要用對應(yīng)版本的工具進(jìn)行

通常情況下windows系統(tǒng)肯定會內(nèi)置 regasm 工具

目錄路徑例如,

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe

如果是應(yīng)用于64位系統(tǒng),則在Framework64 目錄下,否則用 Framework 目錄下,選擇對應(yīng)Framework框架的版本號,其中應(yīng)該能找到 RegAsm.exe 文件

gacutil 工具在微軟提供的 windows sdk 中有,如果沒安裝過,可點擊到官網(wǎng)下載

默認(rèn)安裝后,F(xiàn)rameworkd4.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位系統(tǒng),4.0版本的my.dll為例

將第一趴中生成的dll,復(fù)制到 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\ 下執(zhí)行 gacutil /i my.dll

到目錄 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ 下執(zhí)行 regasm my.dll

5. 注銷DLL

以64位系統(tǒng),4.0版本的my.dll為例

到目錄 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ 下執(zhí)行 regasm my.dll /unregister

到目錄 c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\ 下執(zhí)行 gacutil /u my

php調(diào)用COM組件

以上內(nèi)容都配置無誤以后,就可以在php文件中進(jìn)行調(diào)用,方法如下,

$comClass = new COM('namespace.className');
$comClass -> methodName();

提示沒有COM方法,則需要考慮是否已經(jīng)開啟了php的com功能,或者php_com_dotnet.dll是否加載成功

提示沒有調(diào)用的dll的方法,或者dll未注冊,則需要考慮是否dll文件已經(jīng)注冊成功

PHP開發(fā)環(huán)境搭建工具有哪些

一、phpStudy,是一個新手入門最常用的開發(fā)環(huán)境。

二、WampServer,WampServer也同樣的也是和phpStudy一樣操作簡單對小白比較友好。

三、XAMPP,XAMPP(Apache+MySQL+PHP+PERL)是一個功能強大的建站集成軟件包;

四、MAMP,MAMP分為兩種MAMP和MAMP Pro for Mac。

五、寶塔面板,寶塔面板是一款服務(wù)器管理軟件,支持windows和linux系統(tǒng)。

六、UPUPW,UPUPW是目前Windows平臺下最具特色的Web服務(wù)器PHP套件。

讀到這里,這篇“php無法調(diào)用com組件如何解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI