PHP如何调用C# dll 类库?我来告诉你

有的时候,我们需要在php中利用到其他语言编写的dll类库,如C#编写的dll,方法就是利用PHP new COM方法来调用,在调用之前先要把dll库注册并把程序集放入到全局缓存中。

1. 创建一个 C# Class Library ,命名为:HelloWorld

2.  打开项目的属性,在点选左边的 "Application"(就是第一个tab) , 然后点击 Assembly Information 按钮 , 在弹出的Dialog中, 必须在底部勾上: Make assembly COM-visible !否则 , 这个dll将不能以COM方式访问 . ( 也可以在代码中的类声明中写上[ComVisible(true)] , 效果一样,需要增加using System.Runtime.InteropServices;引用)

3. 创建强命名签名文件并使用

使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示符,输入 sn -k d:HelloWorld.snk 回车即创建了强命名签名文件

打开项目的属性,点选左边Signing 勾上Sign the assembly 在 Choose a strong name key file:处选择 选择刚才创建的HelloWorld.snk文件

4. 创建类库并编译成dll

namespace HelloWorld 

    //[ComVisible(true)] //or check "Assembly COM-Visible" at Application-Assembly_Information dialog ; 
    public class Hello 
    { 
        public string Write() 
        { 
            return "Hello World"; 
        } 
    } 
}

5. 找到dll文件夹路径 ,然后使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示符

进入该dll文件夹下输入:

regasm HelloWorld.dll<回车>

这时候,这个.dll的.net程序集就变成一个标准的Com组件了,但是还不能用,必须让它变成全局Com组件.

将程序集添加到全局程序集缓存中

进入提示符窗口,输入:

gacutil /I HelloWorld.dll<回车>

这时,你的这个dll就被复制到全局程序集缓存中了.也就是说无论在这个电脑的哪个硬盘上都可以使用此dll组件了.

如果不进行强命名签名,这一步会提示加载失败

PHP测试

<?php 
$r=new Com("HelloWorld.Hello"); 
$s=$r->Write(); 
echo $s; 
?> 

命令符下:

CD [/D] [drive:][path] #进入指定路径
CD [..] #返回父目录

时间: 2024-12-07 18:55:23

PHP如何调用C# dll 类库?我来告诉你的相关文章

PHP调用C#开发的dll类库方法

  这篇文章主要介绍了PHP调用C#开发的dll类库方法,包含一个完整的详细的DLL制作步骤和PHP调用方法,需要的朋友可以参考下 有的时候,我们需要在php中利用到其他语言编写的dll类库,如C#编写的dll,方法就是利用PHP new COM方法来调用,在调用之前先要把dll库注册并把程序集放入到全局缓存中. 1. 创建一个 C# Class Library ,命名为:HelloWorld 2. 打开项目的属性,在点选左边的 "Application"(就是第一个tab) , 然后

PHP调用C#开发的dll类库方法_php实例

有的时候,我们需要在php中利用到其他语言编写的dll类库,如C#编写的dll,方法就是利用PHP new COM方法来调用,在调用之前先要把dll库注册并把程序集放入到全局缓存中. 1. 创建一个 C# Class Library ,命名为:HelloWorld2. 打开项目的属性,在点选左边的 "Application"(就是第一个tab) , 然后点击Assembly Information 按钮 ,在弹出的Dialog中, 必须在底部勾上: Make assembly COM-

java基本类库中调用的dll的具体实现在jdk的哪里

问题描述 如题.翻java源码时看到本地方法,只在java类中看到方法声明,但怎么也找到dll具体实现.上网查也没有头绪,求教各位大神 解决方案 解决方案二:应该包含在Java可执行文件中,具体的实现是由操作系统决定.解决方案三:如果在Windows操作系统下,可以用下面的方法研究一下1)安装完整的MicrosoftVisualStudioC++这个步骤主要是要获得dumpbin.exe这个可执行文件我的机器上这个文件在下面这个位置C:ProgramFiles(x86)MicrosoftVisu

c#调用c++dll报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 c++原型函数boolDetBelt(constchar*chImgFile,doubledStrictDegree=1.0,XSCRECTroiRect=XSCRECT(),constchar*dstFile=NULL);structXSCRECT{intx;inty;intheight;intwidth;XSCRECT(){x=0;y=0;height=0;width=0;}};声明c#代码[StructLayoutAttribute(LayoutKind.Sequential)]

在SQL Server 2008中调用.net,dll

原文:在SQL Server 2008中调用.net,dll T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查询,或者其他SQL不便实现的功能.这个随笔中将介绍在SQL Server中扩展C#程序实现正则表达式的替换功能. 新建一个类库程序命名为Regex,打开Visual Studio 2008,点击File,点击New,点击Project,在

C#动态调用C++dll有什么优点,对于内存使用方面有什么影响?

问题描述 我们都知道C#调用C++dll有两种方式:静态调用和动态调用.静态调用调用方式简单,被调用的dll会在程序加载时一起加载到内存中,如果在程序文件夹中没有dll文件,程序会报错.而动态调用调用方式复杂,需借助于API函数来完成dll的加载,卸载及方法调用,就算在程序文件夹中没有dll文件,也可以使程序不报错.另外,在很多文档中都提到动态调用方式能更加有效地使用内存.对于这点我不是很能理解,这里所说的"更加有效"是什么意思?是不是因为静态调用中程序加载时dll会一起加载进内存并一

异常-c# 程序调用外部dll文件对采集模块进行读写,不定时出现以下错误

问题描述 c# 程序调用外部dll文件对采集模块进行读写,不定时出现以下错误 问题签名: 问题事件名称: BEX 应用程序名: NangGang11.20.vshost.exe 应用程序版本: 9.0.21022.8 应用程序时间戳: 47316898 故障模块名称: MSVCR80.dll 故障模块版本: 8.0.50727.6195 故障模块时间戳: 4dcddbf3 异常偏移: 00008aa0 异常代码: c000000d 异常数据: 00000000 解决方案 光给出一个异常信息,天知

C# 制作Com组件:java调用.net DLL的方法

本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:"在Java项目中必须使用其提供的用.net写的DLL加密机制!" 环境与工具: ◆.net framework 3.5 C# ◆java jdk1.5, Tomcat 5.5 ◆jacob-1.15-M3 实现例子: 一.C# 制作Com组件 新建一个Class 项目,取名TestCom 代码 using System;  using System.Collections.Generic;  us

跨越语言的障碍:C++调用C# DLL

当C#项目需要引用C++dll的时候可以直接使用DLLIMPORT来进行调用.而反向的话,C++项目并不能简单靠引用来使用C#DLL.因为C++项目默认配置是没有公共语言运行库支持的.所以我们需要更改一些配置来进行对C# dll的调用.步骤如下: 首先我们完成C# dll开发: namespace Csharp { public class Class1 { public string Name = string.Empty; public Class1() { Name = "We can u