首先,对于这个额外的描述性问题感到抱歉。
我正在实现自己的程序集,而不是从 GAC 调用任何东西!我从 Visual C# 2010 速成版中的类库项目开始。文件 Class1.cs 看起来非常简单:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sample
{
public class MyClass
{
public String generateCode(String s, Array a)
{
return "function " + s " + "(" + a + ") { return a['#handler']; }";
}
}
}
注意:将文件名更改为 MyClass.cs
或者甚至将类名更改为 Class1
甚至会抛出所描述的相同异常以下。
AssemblyInfo.cs
文件包含以下已实现的行:
...
[assembly: AssemblyCulture("en")]
...
[assembly: ComVisible(true)]
...
[assembly: AssemblyVersion("2.3.5.2034")]
[assembly: AssemblyFileVersion("2.3.5.2034")]
[assembly: NeutralResourcesLanguageAttribute("en-IN")]
然后使用 gacutil 工具,我使用以下命令在 GAC 中注册了它:
gacutil /f /i Sample.dll
注意:在我的场景中,参数 -f
和 -i
对将此文件注册到 GAC 没有影响。
因此,我想出了位于 %WINDIR%\Microsoft.NET\assembly\GAC_MSIL\Sample 的
路径。{ProjectFolder}\bin\Release\
路径中的同一个 .dll 文件\v4.0_2.3.5.2034_en_d328b945b0050bbe\
最后,当我在 PHP 中使用 DOTNET 类调用它时
$sample = new DOTNET("Sample, Version=2.3.5.2034, Culture=en, PublicKeyToken=d328b945b0050bbe", "Sample.MyClass");
它抛出以下错误:
PHP Fatal error: Uncaught exception 'com_exception' with message 'Failed to instantiate .Net object [CreateInstance] [0x80070002] The system cannot find the file specified.' in C:\Users\*******\Desktop\Sample.php:2
Stack trace:
#0 C:\Users\*******\Desktop\Sample.php(2): dotnet->dotnet('Sample, Ver...','Sample.MyClass')
#1 {main}
thrown in C:\Users\*******\Desktop\Sample.php on line 2
同样,如果我使用下面的代码,在将主类移动到不同的命名空间后,如 namespace Sample.DotNet.myCompany;
它会抛出一个不同的错误:
$sample = new DOTNET("Sample, Version=2.3.5.2034, Culture=en, PublicKeyToken=d328b945b0050bbe", "Sample.DotNet.myCompany.MyClass");
这抛出了:
PHP Fatal error: Uncaught exception 'com_exception' with message 'Failed to instantiate .Net object [CreateInstance] [0x80131522] ' in C:\Users\*******\Desktop\Sample.php:2
注意:
- 我使用的是 Vista Home Basic (SP 2)、Visual C# 2010 Express 版、PHP 5.4.19、Apache 2.2 和 2.4 版本
- 我在项目属性部分没有设置密码就签署了这个文件。
- 我什至在我的 php.ini 中包含了一行 com.dotnet_runtime = "v4.0.30319"
幸运的是,这似乎不是预期的 PHP 问题,因为我在项目属性部分将程序集目标框架从 4.0 更改为 3.5 客户端配置文件。然后它显然在 %windir%\assembly\
目录中可见,但未能产生任何令人满意的解决方案。
此外,如果我什至将命名空间从命名空间 Sample
更改为
namespace Sample.DotNet.myCompany;
在类反射(reflect)为 Sample.DotNet.myCompany.MyClass
的主文件中,并应用相同的东西,但它却未能完成我需要的事情。
结论:在我的案例中没有任何正确的解决方案!
问题:有什么办法可以解决这个问题吗?详细地说,我是否可以在 PHP 5.4.19 中使用使用 Visual C# 2010 创建的特定 .dll 文件?
最佳答案
您可以尝试将您的 dlll 编译为 x86 而不是 MSIL 吗?
我会启用融合日志并查看那里发生了什么,这样您就可以看到从哪里尝试加载您的程序集。
How to enable assembly bind failure logging (Fusion) in .NET
关于c# - .NET 实例化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184056/