Почему мой 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. Что хорошо.