【问题标题】:.NET Instantiation Error.NET 实例化错误
【发布时间】:2014-09-30 18:51:33
【问题描述】:

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

我正在实现自己的程序集,而不是从 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 中无效。

因此我想出了位于{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 版本
  • 我在项目属性部分没有设置密码就签署了这个文件。
  • 我什至在我的 php.ini 中添加了一行 com.dotnet_runtime = "v4.0.30319"

幸运的是,这似乎不是预期的 PHP 问题,因为我在项目属性部分将程序集目标框架从 4.0 更改为 3.5 客户端配置文件。然后它显然在%windir%\assembly\ 目录中可见,但未能产生任何令人满意的解决方案。

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

namespace Sample.DotNet.myCompany;

在该类反映为Sample.DotNet.myCompany.MyClass 的主文件中,并应用相同的东西,它并没有做我需要的事情。

结论:在我的情况下没有任何正确的解决方案!

问题:有没有办法解决这个问题?详细地说,我可以使用在 PHP 5.4.19 中使用 Visual C# 2010 创建的特定 .dll 文件吗?

【问题讨论】:

  • 在 C# 项目中使用这个 GAC 注册库有什么问题吗?
  • 我已成功将库注册到 GAC。使用 gacutil 功能没有问题。我所面临的故障只是写在这里。我无法调用我最近添加到 GAC 的程序集的方法。
  • 您的 generateCode 方法中有错误。您应该删除方法中的第三个引号

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


【解决方案1】:

您可以尝试将您的 dlll 编译为 x86 而不是 MSIL 吗?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多