从不使用 C# 但使用了很多 php,所以,我从一个基本的东西开始,如果有用的话进行转换,然后有下一段 C# 代码。
using System.Text;
class AES
{
private byte[] _key;
private byte[] _iv;
public AES()
{
}
public AES(string keyBase, string iv)
{
_key = Encoding.ASCII.GetBytes(keyBase);
_iv = Encoding.ASCII.GetBytes(iv);
}
}
然后尝试只转换这一部分,所以我在 php 中做下一个
<?php
class Ejemplo{
public function FunctionName($value = '')
{
echo "Hello world!...";
//var_dump('System'Text'Encoding::GetEncoding());
$stack = new DOTNET("mscorlib", "System.Text.Encoding");
var_dump($stack);
}
}
$eje = new Ejemplo();
$eje->FunctionName('nada');
?>
但在行"$stack = new DOTNET("mscorlib", "System.Text.Encoding");"
收到此错误"致命错误:未捕获的异常'com_exception',消息"无法实例化 .Net 对象 [创建实例] [0x80131513]",
然后寻找网络,我看到需要一个完整的字符串,其中包含版本和其他引用的dll内容,指的是"System.Text.Encoding",我的问题是如何知道dll的信息,可以创建这样的字符串
$csclass = new DOTNET("CSharpCOM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=beb607ae770f5750", "CSharpCOM.CSharpCOMClass");
但对于我的
$stack = new DOTNET("mscorlib", "System.Text.Encoding");
或者,如果有人知道另一种方法可以做到这一点。谢谢大家
对于"mscorlib",不需要提供带有区域性和版本的完整程序集名称,因为这是包含最基本函数的 .NET 核心程序集之一,并且是 .NET 运行时的固定部分。
System.Text.Encoding 是一个抽象类。这就是为什么您无法创建它的实例的原因。在此示例中,您希望使用 System.Text.ASCIIEncoding。因此,直接创建该类的实例:
$encoding = new DOTNET("mscorlib", "System.Text.ASCIIEncoding");
$bytes = $encoding->GetBytes("Hello World");
应该注意的是,在"DOTNET"的帮助下使用PHP的.net程序集是有限的,因为它只允许您实例化类。不能使用静态类和枚举,这意味着无法访问某些 .net API。
您可以改用商业 NetPhp 库。
或者,使用要从 php 使用的专用窄接口用 C# 编写代码。
我相信定义.dll所需的所有信息都可以在.dll本身上找到。您是否费心查找您的mscorlib.dll并查看其文件详细信息?
您也许可以在文件夹{Drive}/Windows/assembly下找到它。您可能需要安装 Msoft 实用程序才能正确查看程序集。一旦您可以通过Msoft工具查看程序集,您就可以获取要使用的公钥令牌和版本
$stack = new DOTNET("mscorlib", "System.Text.Encoding");