PHP5.4调用.Net生成的标准COM组件
今天在PPC看到一贴,问的是PHP调用.Net生成的标准COM组件的方法,本来这是个很蛋疼的问题,鉴于可能有人会遇到类似需求,就在这里讲一下,主要是怎样创建COM组件,以及注册和调用。这里用的环境是VS2010+PHP 5.4.7
一、用C#来写COM组件
首先创建一个C# com组件.实现的功能很简单,就是返回两数相加的和.
1.新建一个C# Project,类型就选Class Library(类库),取名Senc。
2.在项目中添加一个接口,取名Isen。
具体代码:
注意:GUID是使用工具生成的,点菜单栏上的Tools ->Create GUID,然后选第4个选项。
3.新建一个类继承此接口
4.把AssemblyInfo.cs中的[assembly:ComVisible(false)]改成[assembly: ComVisible(true)].右击项目名打开属性窗口,点标签“生成”,选中“输出”→“为COM 互操作注册”.
5.构建。
6.签名(可选操作)。工具->Visual studio 命令提示,输入 sn -k Senc.snk,把Senc.snk拷贝到项目的根目录中和csproj文件相同的目录.
打开项目属性窗口,点标签“签名”,选中“为程序集签名”,并在下面的下拉列表中点“浏览”,然后弹出一个对话框来,选中Senc.snk
再次构建生成dll文件.
7.注册,REGASM Senc.dll。(注意:Regsvr32也是注册组件的,但Regsvr32用来将非托管代码控件注册为COM组件,Regasm则是.NET下的注册COM组件的工具,因为是.Net写的组件,所以我用REGASM注册,否则将提示模块“xx.dll”已加载,但找不到入口点DllRegisterServer。卸载同理)

二、在PHP程序中调用
先到PHP.INI中打开COM选项,com.allow_dcom = true
另外需要了解的是,COM组件虽然也是DLL扩展,但它不是PHP扩展,所以把Senc.dll拷贝到php/ext 目录,然后在PHP.INI里加载是错误的,PHP也不认识它。
运行结果输出39,符合预期。
注意:非特殊需求不推荐这么做,其实.NET或PHP代码都很简单,帖子中楼主完全可以用PHP来实现。
怎么查看COM组件提供的方法呢?使用OLEVIEW工具即可,VS2008以后,这个工具已经被移到WINDOWS SDK中了,路径为C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\OleView.Exe,,点击“View Typelib”,打开之前1.5小步构建后生成的tld文件即可了。如图所示:
一、用C#来写COM组件
首先创建一个C# com组件.实现的功能很简单,就是返回两数相加的和.
1.新建一个C# Project,类型就选Class Library(类库),取名Senc。
2.在项目中添加一个接口,取名Isen。
具体代码:
using System;COM组件要求使用接口,接口和类必须都是public的,这里就不详述了。
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Senc
{
[Guid("D8445E8A-749A-4FC7-BEF3-C80A81A64285")]
[ComVisible(true)]
public interface Isen
{
[DispId(1)]///如果还要添加其他函数就继续来个[DispId(2)],[DispId(3)]加在函数前面
int encrypt(int one, int two);
}
}
注意:GUID是使用工具生成的,点菜单栏上的Tools ->Create GUID,然后选第4个选项。
3.新建一个类继承此接口
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Senc
{
[Guid("2B8D1651-CF62-4461-B970-E91E41C3EF2C")]
[ClassInterface(ClassInterfaceType.None)]
public class ClassIsen:Isen
{
public int encrypt(int one, int two)
{
return one*3+two*7+12;
}
}
}
4.把AssemblyInfo.cs中的[assembly:ComVisible(false)]改成[assembly: ComVisible(true)].右击项目名打开属性窗口,点标签“生成”,选中“输出”→“为COM 互操作注册”.
5.构建。
6.签名(可选操作)。工具->Visual studio 命令提示,输入 sn -k Senc.snk,把Senc.snk拷贝到项目的根目录中和csproj文件相同的目录.
打开项目属性窗口,点标签“签名”,选中“为程序集签名”,并在下面的下拉列表中点“浏览”,然后弹出一个对话框来,选中Senc.snk
再次构建生成dll文件.
7.注册,REGASM Senc.dll。(注意:Regsvr32也是注册组件的,但Regsvr32用来将非托管代码控件注册为COM组件,Regasm则是.NET下的注册COM组件的工具,因为是.Net写的组件,所以我用REGASM注册,否则将提示模块“xx.dll”已加载,但找不到入口点DllRegisterServer。卸载同理)

二、在PHP程序中调用
先到PHP.INI中打开COM选项,com.allow_dcom = true
<?php注意:我这里的环境是PHP5.4.7,PHP 5.4.5后,com/dotnet 模块已经成了单独的扩展,所以需要在PHP.ini中配置extension=php_com_dotnet.dll,如果PHP VERSION<5.4.5 则不需要。否则的话,可能就是报错 Fatal error: Class 'COM' not found 了。
$b=new COM("Senc.ClassIsen") or die("Unable to instantiate");
$ret=$b->encrypt(2,3);
var_dump($ret);
另外需要了解的是,COM组件虽然也是DLL扩展,但它不是PHP扩展,所以把Senc.dll拷贝到php/ext 目录,然后在PHP.INI里加载是错误的,PHP也不认识它。
运行结果输出39,符合预期。
注意:非特殊需求不推荐这么做,其实.NET或PHP代码都很简单,帖子中楼主完全可以用PHP来实现。
怎么查看COM组件提供的方法呢?使用OLEVIEW工具即可,VS2008以后,这个工具已经被移到WINDOWS SDK中了,路径为C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\OleView.Exe,,点击“View Typelib”,打开之前1.5小步构建后生成的tld文件即可了。如图所示:
写得好,我是 c# 新手 不太懂
开个RSS 全文输出嘛
有RSS啊,http://www.zhurouyoudu.com/index.php/feed/ 和
http://www.zhurouyoudu.com/index.php/feed/rss/ 都是啊