为什么我的COM对象不在组件服务中显示方法?

时间:2013-12-05 13:36:46

标签: c# .net visual-studio-2012 com com+

我正在尝试创建一个COM对象并在COM +下注册它。一切似乎进展顺利,但是当我查看组件服务并深入了解

  

控制台根目录|组件服务|电脑|我的电脑| COM +应用程序| TestCom |组件| TestCom.Com.MyCom |接口| _MyCom |方法

我没有看到列出的方法。

在我的项目属性中,我已经签署了我的程序集。

的AssemblyInfo.cs:

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

MyCom.cs

使用System; 使用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 个答案:

答案 0 :(得分:2)

您在此处使用默认设置。 [ComVisible]对象支持的默认接口是IDispatch,仅适用于后期绑定。这是微软更喜欢的方式,当客户端代码假定组件的不同版本时,更少的痛苦,这个问题称为DLL Hell。脚本语言总是使用IDispatch,并且不需要方法可见。编译语言通常支持早期绑定,您可以添加类型库,您将获得语法错误检查和自动完成以及大大提高的运行时性能。编程时非常方便,但在DLL Hell攻击时风险很大。

如果要查看方法,则必须在声明的公共接口上使用[InterfaceType(ComInterfaceType.InterfaceIsDual)]属性。其中公开了IDispatch 类型库中的接口类型。您将不再拥有自动生成的_MyCom界面,您可以看到自己的界面。您通常称之为IMyCom

这需要明确声明接口,以便您可以应用该属性。如果你没有这样做,通常会有点不便。您还可以将[ClassInterface(ClassInterfaceType.AutoDual)]应用于您公开的公共类。缺点是您还公开System.Object的成员并依赖.NET Framework类型库。哪个好看。