我正在尝试创建一个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
我必须遗漏一些东西,我只是想不通它是什么。
答案 0 :(得分:2)
您在此处使用默认设置。 [ComVisible]对象支持的默认接口是IDispatch,仅适用于后期绑定。这是微软更喜欢的方式,当客户端代码假定组件的不同版本时,更少的痛苦,这个问题称为DLL Hell。脚本语言总是使用IDispatch,并且不需要方法可见。编译语言通常支持早期绑定,您可以添加类型库,您将获得语法错误检查和自动完成以及大大提高的运行时性能。编程时非常方便,但在DLL Hell攻击时风险很大。
如果要查看方法,则必须在声明的公共接口上使用[InterfaceType(ComInterfaceType.InterfaceIsDual)]
属性。其中公开了IDispatch 和类型库中的接口类型。您将不再拥有自动生成的_MyCom
界面,您可以看到自己的界面。您通常称之为IMyCom
。
这需要明确声明接口,以便您可以应用该属性。如果你没有这样做,通常会有点不便。您还可以将[ClassInterface(ClassInterfaceType.AutoDual)]
应用于您公开的公共类。缺点是您还公开System.Object的成员并依赖.NET Framework类型库。哪个好看。