Ошибка при создании экземпляра класса взаимодействия .NET / COM через классический ASP - PullRequest
1 голос
/ 12 ноября 2009

У меня возникла проблема при попытке создать экземпляр класса C # .NET, который был открыт для COM в классическом приложении ASP. Я использовал tlbexp для создания библиотеки типов и зарегистрировал ее в службах компонентов; Теперь при попытке создать объект как таковой:

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

Я получаю ошибку:

Ошибка объекта сервера 'ASP 0177: 80131534'

Server.CreateObject Failed

Я искал в Интернете информацию об этой ошибке и нашел многочисленные обсуждения, но не нашел решения. Код ошибки 0x80131534, очевидно, означает «COR_E_TYPEINITIALIZATION, тип, который не удалось инициализировать», что предполагает, что проблема будет в конструкторе. Конструктор рассматриваемого класса устанавливает личное поле для экземпляра другого класса из той же сборки, а затем считывает некоторые параметры конфигурации из файла XML. Это поведение проверено модулем, и я проверил, что файл существует; Я не вижу ничего другого, что могло бы там проникнуть.

Несколько других моментов, которые могут или не могут быть полезны:

  • Тестовый проект .NET, ссылающийся на DLL, может создать экземпляр класса просто отлично; однако тестовый проект VB6, ссылающийся на TLB, взрывается с той же ошибкой. И DLL, и TLB находятся в одном месте.
  • Это приложение работает локально, в Windows XP Professional SP3 и IIS 5.1.
  • Сборка .NET построена с использованием .NET Framework 2.0, хотя на машине установлено 3.5.

Я знаю других людей, которые не получают эту ошибку в своих сборках, поэтому я считаю, что это может быть что-то экологическое. Любые предложения приветствуются, так как я пытался исправить это в течение некоторого времени.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 23 июля 2014

У нас была точно такая же проблема с классом, в котором был конструктор. Как ни странно, только на старых серверах новые будут работать нормально.

Мы исправили это, добавив пустой открытый конструктор по умолчанию ...

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 Это может быть связано с тем, почему он работал без пустого открытого конструктора по умолчанию.

0 голосов
/ 12 ноября 2009

Если можете, попробуйте использовать вашу библиотеку с другого динамического языка с поддержкой COM. Если вы не знаете ни одного, вот небольшой фрагмент кода, который вы можете использовать, если у вас есть удобный 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 создана вами?

0 голосов
/ 12 ноября 2009

Я почти уверен, Regasm.exe необходимо использовать для регистрации .Net DLL, чтобы открыть его для COM

Интересный пост по теме http://www.simple -talk.com / dotnet / visual-studio / build-and-deploy-a-.net-com-assembly /

...