本文小編為大家詳細(xì)介紹“php無法調(diào)用com組件如何解決”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“php無法調(diào)用com組件如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、六合ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的六合網(wǎng)站制作公司
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àng)中出現(xiàn)一項(xiàng)“零工”,要在已有的php工程中增加一項(xiàng)功能,而且工程以及所需要實(shí)現(xiàn)功能的源代碼工程也都有,本是一件很容易的事情。雖然我鮮少用到php,不過這不是最重要的“限制因素”,讓我頭疼的是,功能庫部分是用.NET框架實(shí)現(xiàn)的,里面有很多對(duì)數(shù)據(jù)格式的調(diào)整,相對(duì)比較復(fù)雜,沒有功能邏輯手冊(cè),很難在php中復(fù)寫一份。所以要在php中直接引用.NET的動(dòng)態(tài)庫就成了完成“任務(wù)”的關(guān)鍵
網(wǎng)上很多前輩記錄了這個(gè)問題,但照葫蘆畫瓢未能成功,本文就是在“肝零工”的過程中,遇到并填坑的記錄
生成COM組件動(dòng)態(tài)庫
COM component(COM組件)是微軟開發(fā)的軟件開發(fā)技術(shù)。其實(shí)質(zhì)是一些小的二進(jìn)制可執(zhí)行程序,它們可以給應(yīng)用程序,操作系統(tǒng)以及其他組件提供服務(wù)。而在php中如果想要引用第三方動(dòng)態(tài)庫,需要通過 new COM("Component.class") 的方法來實(shí)現(xiàn),其中的 Component 必須是COM組件
1. 構(gòu)建Windows類庫項(xiàng)目
無論是哪個(gè)版本的Framework,應(yīng)該都能夠在Windows標(biāo)簽下找到類庫項(xiàng)目
這樣工程中默認(rèn)會(huì)有 Properties\AssemblyInfo.cs 文件,里面記錄了項(xiàng)目集所需的信息
2. 目標(biāo)框架要匹配
創(chuàng)建項(xiàng)目的時(shí)候可以對(duì)Framework進(jìn)行選擇
如果是后期調(diào)整,可在工程屬性 > 應(yīng)用程序中的目標(biāo)框架中進(jìn)行修改
注意,需要于后期注冊(cè)dll的時(shí)候的框架保持一致
3. 設(shè)置COM組件可見
在 Properties\AssemblyInfo.cs 文件中,將 ComVisible 進(jìn)行如下修改
[assembly: ComVisible(true)]
4. 要設(shè)置簽名并設(shè)置強(qiáng)名稱密鑰
工程屬性 > 簽名中,勾選 “為程序集簽名” ,同時(shí)在下方 “選擇強(qiáng)名稱密鑰文件” 中新建密鑰文件
然后生成,在 bin\Debug 目錄下找到對(duì)應(yīng)的 dll 文件
5. 如果存在無法嵌入的動(dòng)態(tài)庫
假如工程Framework版本較低,或者,
引用的庫缺少互操作所需特性,
總之,無法對(duì)引用庫進(jìn)行嵌入互操作
那么,依賴的dll,也需要執(zhí)行后續(xù)的注冊(cè)等操作
將DLL注冊(cè)到服務(wù)器上
涉及到系統(tǒng)級(jí)的操作,坑甚多…
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用的是哪個(gè)版本的框架,此處也需要用對(duì)應(yīng)版本的工具進(jìn)行
通常情況下windows系統(tǒng)肯定會(huì)內(nèi)置 regasm 工具
目錄路徑例如,
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe
如果是應(yīng)用于64位系統(tǒng),則在Framework64 目錄下,否則用 Framework 目錄下,選擇對(duì)應(yīng)Framework框架的版本號(hào),其中應(yīng)該能找到 RegAsm.exe 文件
gacutil 工具在微軟提供的 windows sdk 中有,如果沒安裝過,可點(diǎn)擊到官網(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. 緩存和注冊(cè)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未注冊(cè),則需要考慮是否dll文件已經(jīng)注冊(cè)成功
一、phpStudy,是一個(gè)新手入門最常用的開發(fā)環(huán)境。
二、WampServer,WampServer也同樣的也是和phpStudy一樣操作簡單對(duì)小白比較友好。
三、XAMPP,XAMPP(Apache+MySQL+PHP+PERL)是一個(gè)功能強(qiáng)大的建站集成軟件包;
四、MAMP,MAMP分為兩種MAMP和MAMP Pro for Mac。
五、寶塔面板,寶塔面板是一款服務(wù)器管理軟件,支持windows和linux系統(tǒng)。
六、UPUPW,UPUPW是目前Windows平臺(tái)下最具特色的Web服務(wù)器PHP套件。
讀到這里,這篇“php無法調(diào)用com組件如何解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。