【问题标题】:Error when instantiating .NET/COM interop class via classic ASP通过经典 ASP 实例化 .NET/COM 互操作类时出错
【发布时间】:2010-12-15 22:53:20
【问题描述】:

我在尝试实例化在经典 ASP 应用程序中暴露给 COM 的 C# .NET 类时遇到问题。我已经使用 tlbexp 生成了一个 typelib 并在 Component Services 中注册了它;现在尝试这样创建对象时:

Server.CreateObject("The.Class.Name")

我收到错误:

服务器对象错误 'ASP 0177 : 80131534'

Server.CreateObject 失败

我在网上搜索了有关此错误的信息,发现了很多讨论但没有解决方案。错误代码 0x80131534 显然意味着“COR_E_TYPEINITIALIZATION,类型无法初始化”,这表明问题出在构造函数中。相关类的构造函数将私有字段设置为来自同一程序集的另一个类的实例,然后从 XML 文件中读取一些配置设置。此行为经过单元测试,我已检查该文件是否存在;我看不到任何其他可能闯入其中的东西。

其他几点可能有用也可能没用:

  • 引用 DLL 的测试 .NET 项目可以很好地实例化该类;然而,一个引用 TLB 的测试 VB6 项目因同样的错误而崩溃。 DLL 和 TLB 都在同一个位置。
  • 此应用程序在 Windows XP Professional SP3 和 IIS 5.1 上本地运行。
  • .NET 程序集是使用 .NET Framework 2.0 构建的,尽管计算机上安装了 3.5。

我知道其他人在他们的构建中没有遇到这个错误,所以我相信这可能是环境问题。欢迎任何建议,因为我一直在努力解决这个问题。

提前致谢。

【问题讨论】:

  • 你是如何注册 DLL 的?
  • 我在组件服务下有一个应用程序文件夹,其中包含此应用程序的所有 COM 组件。我通过管理控制台手动将组件安装到那里(右键单击,新建,组件,安装新组件,选择 .TLB)
  • C# 库是您编写的,还是您找到并尝试使用的?
  • 不,我不是亲自编写的,尽管我可以访问源代码。我实际上已经设法让问题消失了,尽管我认为这不是一个很好的解决方案并且没有揭示问题。我使用 regsvcs /i 注册 DLL 并将其复制到 \System32。这解决了问题。然后我从 \System32 中删除了该副本,该应用程序现在可以正常运行,使用正确位置的那个。不过,我不知道这里发生了什么!

标签: .net com asp-classic interop


【解决方案1】:

对于具有构造函数的类,我们遇到了完全相同的问题。有趣的是,只有在较旧的服务器上,较新的服务器才能正常工作。

我们通过添加一个空白的公共默认构造函数来修复它...

public class MyClass
{
    public string MyGString
    {
        get; set;
    }

    //Com Fix
    public MyClass(){}

    //Normal Class
    public MyClass(string myString)
    {
        HashAlgorithm = hashType;
    }

有人跟我有同样的问题...

http://social.msdn.microsoft.com/Forums/vstudio/en-US/4b021da2-3fc7-4f20-b3d0-0f90491a232e/regasm-not-registering-all-classes

较新的服务器具有此版本的 RegAsm 2.0.50727.5420 旧的服务器具有此版本 2.0.50727.3053 这可能与它在没有空白公共默认构造函数的情况下工作的原因有关。

【讨论】:

  • 这是 .NET 互操作的限制...如果要使用 CreateInstance() 函数,则需要默认构造函数
【解决方案2】:

如果可以,请尝试使用另一种支持 COM 的动态语言中的库。如果您不知道,这里有一个可以使用的快速 sn-p,如果您手边有 perl。 (如果没有,请抓住ActivePerl 快速入门)

use strict;
use warnings;
use Win32::OLE;

my $object = Win32::OLE->new('my.object.1')
    or die "Unable to create my.object.1!";
if (my $error = Win32::OLE->LastError()) {
    die "Still got an error starting up: $error\n";
}
print "Good!\n";

或者,如果 Python 是您的工作,请获取并安装 PyWin32 并尝试以下操作:

try:
    import win32com.client as w32c
    from win32com.client import util
except ImportError:
    print "\npywin32 package must be installed.  Available https://sourceforge.net/projects/pywin32/\n"
    sys.exit()
lib = w32c.dynamic.Dispatch("my.object.1")
# error checking and more, yatta

如果这可行,则可能是您的 ASP 应用程序存在配置问题。如果没有,则意味着您尝试创建的对象 a) 未注册,或 b) 库有问题。 .NET dll 必须正确设置才能导出到 COM。这个 .NET 库是您自己创建的吗?

【讨论】:

    【解决方案3】:

    我很确定需要使用 Regasm.exe 注册一个 .Net dll 以将其公开给 COM

    关于主题http://www.simple-talk.com/dotnet/visual-studio/build-and-deploy-a-.net-com-assembly/的有趣帖子

    【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2011-02-18
    • 2011-02-25
    • 2012-06-09
    • 2012-10-07
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多