.NET实例化错误

时间:2014-08-07 13:38:12

标签: c# php .net visual-studio-2010

首先,抱歉这个额外的描述性问题。

我正在实施自己的程序集而不是从GAC调用任何东西!我开始使用Visual C#2010 Express版中的类库项目。文件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无效。

因此我提出了位于{ProjectFolder}\bin\Release\路径%WINDIR%\Microsoft.NET\assembly\GAC_MSIL\Sample\v4.0_2.3.5.2034_en_d328b945b0050bbe\路径的相同.dll文件。

最后,当我在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版本
  • 我在“项目属性”部分中没有设置任何密码签名此文件。
  • 我甚至包括一行com.dotnet_runtime =" v4.0.30319"到我的php.ini

幸运的是,这似乎不是预期的PHP问题,因为我在Project Properties部分中将程序集Target Framework从4.0更改为3.5 Client Profile。然后它显然在%windir%\assembly\目录中可见,但未能产生任何令人满意的解决方案。

此外,如果我甚至将名称空间从名称空间Sample更改为

namespace Sample.DotNet.myCompany;

在主要文件中,该类反映为Sample.DotNet.myCompany.MyClass,并应用相同的内容,但它无法完成我所需的操作。

结论:在我的案例中没有任何正确的解决方案!

问题:有什么方法可以解决这个问题吗?精心设计,我可以使用PHP 5.4.19中使用Visual C#2010创建的特定.dll文件吗?

1 个答案:

答案 0 :(得分:0)

你能尝试将你的dll编译为x86而不是MSIL吗?

我会去启用融合日志,看看那里发生了什么,这样你就可以看到从哪里尝试加载你的程序集。

How to enable assembly bind failure logging (Fusion) in .NET