我是 PHP 的新手,今天我发现DOTNET http://php.net/manual/en/class.dotnet.php class.
所以我学习了手册,上网寻找一些例子,最后编写了我的测试应用程序:
- 使用 Framework 4.0 Client Profile 创建了一个新的 DLL
- 使用强名称密钥对程序集进行签名
- 将程序集标记为 COM 可见
这是我写的测试代码
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
I see
全局程序集缓存和程序集后续程序缓存:
csharpcom,版本=1.0.0.0,文化=中性,
PublicKeyToken=beb607ae770f5750,处理器架构=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] 不可能找到文件规格。
翻译可能是:找不到指定的文件
另一件事:使用一些例子(一个非常基本的例子here http://geekswithblogs.net/tkokke/archive/2009/04/24/how-to-use-.net-assemblies-in-php.aspx)我读到我的程序集(注册后)应该位于%windir%\assembly
,但我只能在其中找到它%windi%\Microsoft.NET\assembly\GAC_MSIL\CSharpCOM\v4.0_1.0.0.0__beb607ae770f5750
: 它是否正确?为什么我的第一个目录没有它?
更多:如果我创建另一个框架项目并尝试添加 .NET 引用,我找不到我的程序集:这是否与我无法从 PHP 加载此程序集有关?
最后说明:我在 Windows XP Professional SP3 32 位和 Windows 7 Enterprise 64 位上尝试过
UPDATE:
这有效:
$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 程序集?