Класс C # COM - DISP_E_UNKNOWNNAME - PullRequest
       32

Класс C # COM - DISP_E_UNKNOWNNAME

2 голосов
/ 11 сентября 2010

Я объявил COM видимый класс в C #.Код выглядит следующим образом:

[ComVisible(true)]
public class AComVisibleClass : TheParentClass
{
    public bool SomeFunc(string id)
    {
        return true;
    }

}

Этот класс создается заводским классом, также доступным для COM.

Но если я пытаюсь получить доступ к файлу сценария VB, a DISP_E_UNKNOWNNAMEисключение.

Это новый класс в уже существующей библиотеке, которую мы имеем здесь на работе.Все остальные классы доступны через COM.Вся библиотека скомпилирована в один файл сборки.Я зарегистрировал новую сборку, используя regasm, но все еще получаю это исключение.

Я попытался отладить вызов COM, используя VS2008.Кажется, что фабричный класс может создавать экземпляр AComVisibleClass.Вышеупомянутое исключение выдается, только когда фабрика пытается выполнить SomeFunc.

Я знаю, что это может звучать немного (?) Немного расплывчато, но я не могу раскрыть здесь реальный код.Если кому-то нужна дополнительная информация, пожалуйста, спросите меня.

Ответы [ 2 ]

4 голосов
/ 11 сентября 2010

Я могу подумать о трех возможных причинах этой проблемы:

Причина 1: неверное имя, используемое в CreateObject:

Я предполагаю, что ваш код VBScript вызывает что-то вродеthis:

 Set obj = CreateObject("MyLibrary.AComVisibleClass")

Если это правильно, откройте редактор реестра и проверьте, содержит ли ключ HKEY_CLASSES_ROOT подраздел с именем MyLibrary.AComVisibleClass.Если это не так, то имя вашей библиотеки может отличаться от ожидаемого.Найдите в реестре AComVisibleClass, чтобы найти правильное имя библиотеки.

Причина 2: 64-разрядные проблемы:

Если проблема возникает в 64-разрядной операционной системесистема может быть вызвана тем, что ваш VBScript работает как 32-разрядный процесс, а C # COM DLL - 64-разрядная или наоборот.

Причина 3: неправильное имя функции:

Возможно, вы используете неверное имя функции в сценарии, например obj.SomeFnc(1) вместо obj.SomeFunc(1), или выбранное вами имя функции является зарезервированным ключевым словом в VBScript или содержит необычные символы.

0 голосов
/ 11 сентября 2010

Похоже, вам нужно поддерживать IDispatch.

Извлечь Поддерживает ли C # .NET позднюю привязку IDispatch?

edit

Этот ответ, вероятно, неправильный, и я все же могу его удалить.Пока что это, кажется, добавляет ценности, поэтому я позволю этому остаться.

...