使用 PHP 调用 C# .net .dll 脚本

Posted

技术标签:

【中文标题】使用 PHP 调用 C# .net .dll 脚本【英文标题】:Call a C# .net .dll script using PHP 【发布时间】:2015-01-16 22:46:45 【问题描述】:

我有一个 C# .net dll 脚本,它调用SELECTs 数据的 SQL 存储过程,以便运行相关方法。

我需要使用 php 运行 dll,因为我的整个应用程序都是用 PHP 构建的。

最好的方法是什么?

我对 C# 完全没有经验。

编辑

我使用以下方法成功注册了 .net dll:

RegAsm.exe DllName.dll /tlb:DllName.tlb

我现在应该可以使用如下所述的 PHP 的 COM() 方法来调用 dll 的函数/方法。

但是当 .net dll 注册为程序集时,这些函数是否仍可通过 COM() 方法访问?有区别吗?

编辑

注册 .net dll 程序集后,当我尝试使用 COM() 调用方法时收到错误消息:

"PHP Fatal error:  Uncaught exception 'com_exception' with message 'Failed
 to create COM object `DllName.ClassName': Invalid syntax"

编辑

尝试使用:

new DOTNET('DllName, Version=4.0.30319.33440, Culture=neutral,
PublicTokenKey=14843e0419858c21', 'ClassName');

收到internal server 500 错误

这是因为 PHP 不与 .net 4 程序集通信吗?

【问题讨论】:

最好的方法是将查询转换为 PHP 实现。您也可以使用exec() php 函数,但我认为当前端不是外壳时使用此代码被认为是不好的做法.. 我对 C# 语言的了解不足以转换为 PHP。这是我的第一个想法哈哈。但脚本对我来说是希腊语,它似乎在调用 c# 函数。 C# 脚本是什么意思? C# 被编译成 exe 或 dll。 某处,不知何故应该扣掉查询,但是没有源代码,我们无法给出准确的答案…… 脚本是一个.dll文件 【参考方案1】:

选项 1:使用 DLL

您可以使用 PHP 的 COM 类调用该函数。

您需要在 Windows 上运行 PHP,如果您使用 C# DLL,我假设您是这样。

步骤:

    在命令提示符或运行对话框中使用命令regasm yourdllname.dll 注册 DLL。 您的计算机上安装的每个 .NET 版本都有一个 RegAsm.exe,因此请确保通过从 %windir 运行 DLL 所针对的 .NET 版本执行一个%\Microsoft.NET\AppropriateVersion。 在 PHP 中创建一个引用 DLL 类名的 COM 对象。 调用函数,该函数将作为您创建的 COM 对象的方法使用。

示例:

$object = new COM('MyDllProjectName.MyDllClassName');
$object->myMethod();

选项 2:用 PHP 重写

如前所述,更简洁、跨平台的选项是直接在 PHP 中重新实现 SQL 查询,尤其是当您使用 DLL 的唯一原因是运行查询时。

【讨论】:

选项 3 通过 web 服务访问 DLL 我很困惑,myMethod() 来自哪里?它是在那里实例化的吗?那我怎么称呼它? 您可以将myMethod 替换为在您的DLL 中调用SQL 存储过程的方法(函数)的名称。 我尝试注册 dll,但出现错误提示 ..the-entry point DllRegisterServer was not found 尝试使用regasm (C:\Windows\Microsoft.NET\Framework\YourVersion\RegAsm.exe) 而不是regsvr32。语法相同:regasm yourdllname.dll.【参考方案2】:

直接使用 COM 有很多注意事项和问题。

有一个名为 NetPhp 的库使用反射在 COM 之上进行抽象,因此您可以从 PHP 中轻松调用任何 .dll:

http://www.drupalonwindows.com/en/blog/calling-net-framework-and-net-assemblies-php

【讨论】:

以上是关于使用 PHP 调用 C# .net .dll 脚本的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何调用动态链接库DLL

其它语言如何调用c# DLL

python中调用 C#动态链接库问题记录

php调用C#写的dll包

C#_技巧:.net下C++调用C#的dll

.net C# C/S模式,如何把一个项目封装为dll以便其他项目调用