Почему мой COM-объект не отображает методы в службах компонентов?

Я пытаюсь создать COM-объект и зарегистрировать его в COM+. Кажется, все идет хорошо, но когда я смотрю в Службы компонентов и просматриваю детали

Консоль Root | Компонент Услуги | Компьютеры | Мой компьютер | COM+ Приложения | TestCom | Компоненты TestCom.Com.MyCom | Интерфейсы _MyCom | методы

Я не вижу свой метод в списке.

В свойствах моего проекта я подписал мою сборку.

AssemblyInfo.cs:

[assembly: ApplicationName("TestCom")]
[assembly: ApplicationAccessControl(false)]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ComVisible(true)]

MyCom.cs

используя Систему; использование System.EnterpriseServices;

namespace TestCom.Com
{
    [Transaction(TransactionOption.Required)]
    public class MyCom : ServicedComponent
    {
        [AutoComplete]
        public int GetIntFromCom()
        {
            var results = new Random(DateTime.Now.Second).Next();
            return results;
        }
    }
}

Я строю DLL и в командной строке VS2012 я запускаю regsvcs TestCom.Com.dll. Это приводит к:

Installed Assembly:
Assembly: c:\TestCom.Com.dll
Application: TestCom
TypeLib: c:\TestCom.Com.tlb

Я должно быть что-то упустил, я просто не могу понять, что это такое.

1 ответ

Решение

Вы используете настройки по умолчанию здесь. Интерфейс по умолчанию, поддерживаемый объектами [ComVisible], - IDispatch, подходит только для позднего связывания. Именно так предпочитает Microsoft, намного меньше страданий, когда клиентский код принимает другую версию компонента, проблему, известную как DLL Hell. Языки сценариев всегда используют IDispatch и не нуждаются в видимых методах. Скомпилированные языки обычно поддерживают раннее связывание, вы можете добавить библиотеку типов, и вы получите проверку синтаксических ошибок и автозаполнение, а также значительно улучшенную производительность во время выполнения. Большое удобство при программировании, но очень рискованно, когда попадает DLL Hell.

Если вы хотите увидеть методы, то вы должны использовать [InterfaceType(ComInterfaceType.InterfaceIsDual)] атрибут на открытых интерфейсах, которые вы объявляете. Который выставляет IDispatch и тип интерфейса в библиотеке типов. У вас не будет автоматически сгенерированного _MyCom интерфейс больше, вы видите свой собственный. Как правило, вы бы назвали это IMyCom,

Это требует явного объявления интерфейса, чтобы вы могли применить атрибут. Обычно это немного неудобно, если вы не начинали таким образом. Вы также можете подать заявку [ClassInterface(ClassInterfaceType.AutoDual)] для публичного класса вы выставляете. С тем недостатком, что вы также предоставляете доступ к членам System.Object и получаете зависимость от библиотеки типов.NET Framework. Что хорошо.

Другие вопросы по тегам