我是 PHP 的新手,今天我发现了DOTNET类。
所以我研究了手册,上网找了一些例子,最后写了我的测试应用程序:
- 使用 Framework 4.0 Client Profile 创建了一个新的 DLL
- 使用强名称密钥签署程序集
- 将程序集标记为 COM-Visible
这是我写的测试代码
using System;
namespace CSharpCOM
{
public class CSharpCOMClass
{
public string Base64(string s)
{
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(s));
}
}
}
我编译了程序集,然后在 GAC ( gacutil /if fullpath\CSharpCOM.dll
) 中注册。
如果我使用gacutil /l CSharpCOM
我看到
La cache di assembly globale contiene gli assembly seguenti:
csharpcom,Version=1.0.0.0,Culture=neutral,PublicKeyToken=beb607ae770f5750,processorArchitecture=MSIL元素数 = 1
所以一切似乎都很好。
然后写了这个基本的php:
<?php
try{
$csclass = new DOTNET("CSharpCOM, Version=1.0.0.0, Culture=neutral, " .
"PublicKeyToken=beb607ae770f5750",
"CSharpCOM.CSharpCOMClass");
echo $csclass->Base64("Test string"),"\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
?>
无论我尝试什么,加载托管在 Apache ( http://localhost/test01/dotnet.php
) 中的页面我总是得到
捕获的异常:无法实例化 .Net 对象 [CreateInstance] [0x80070002] 不可能的 trovare il 文件规范。
翻译可能是:找不到指定的文件
还有一件事:使用一些例子(这里是一个非常基本的例子)我读到我的程序集(注册时)应该在 上找到%windir%\assembly
,但我只能在%windi%\Microsoft.NET\assembly\GAC_MSIL\CSharpCOM\v4.0_1.0.0.0__beb607ae770f5750
: 这是正确的吗?为什么我的第一个目录没有它?
更多:如果我创建另一个框架项目并尝试添加 .NET 引用,我找不到我的程序集:这与我无法从 PHP 加载此程序集有关吗?
最后一点:我在 Windows XP Professional SP3 32bit 和 Windows Seven Enterprise 64bit 上试过
更新:
这有效:
$form = new DOTNET('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'System.Windows.Forms.Form');
但是这个没有:
$form = new DOTNET('System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'System.Windows.Forms.Form');`
PHP 是否有可能只加载框架 2.0 程序集?