ClassInterface

ClassInterface

类接口是未在托管代码中显式定义的接口,它将公开在 .NET 对象上显式公开的所有公共方法、属性、字段和事件。此接口可以是双绑定接口,也可以是仅调度接口。

• ClassInterfaceType.None
• ClassInterfaceType.AutoDispatc
• ClassInterfaceType.AutoDual
None 指示不为类生成类接口。如果未显式实现任何接口,则该类将只通过 IDispatch 接口提供后期绑定访问。这是 ClassInterfaceAttribute 的推荐设置。要通过由类显式实现的接口来公开功能,唯一的方法是使用 ClassInterfaceType.None
AutoDispatch 指示该类只支持 COM 客户端的后期绑定。在请求时,该类的调度接口将自动向 COM 客户端公开。类型 类型库导出程序 (Tlbexp.exe) 生成的类型库不包含调度接口的类型信息,以防止客户端缓存接口的 DISPID。由于客户端只能后期绑定到调度接口,因此该接口不会出现 ClassInterfaceAttribute 中所述的版本控制问题。
AutoDual 指示自动为类生成双重类接口并向 COM 公开。为该类接口生成类型信息并在类型库中发布。由于 ClassInterfaceAttribute 中描述的版本控制方面的限制,极力建议不要使用 AutoDual

By default 当生成COM组件的时候,compiler会使用ClassInterfaceType.AutoDispatch

ClassInterfaceType.AutoDispatch:
只有一个 IDispatch 类接口被自动生成但是没有类型信息(typeinfo),所以dispids 没有保存下来。 
好处: 没有版本控制问题,因为类只支持 late binding without caching dispids. Works cleanly from script.  
坏处: 需要用户的工作量大了,而且对vb6用户更难,应为everything 必须声明为Object.  速度较慢,因为第一次调用必须通过 GetIdsOfNames()然后 Invoke().  

ClassInterfaceType.AutoDual 仅推荐在开发环境中使用,在产品环境中强烈不推荐,因为它的版本控制是个大麻烦。

ClassInterfaceType.None:
灵活性最大。

所以办法是:1)如果仅仅是测试目的,可以使用ClassInterfaceType.AutoDual:
 [ClassInterface(ClassInterfaceType.AutoDual)]
  public class SimpleClass {
    public SimpleClass() {
     }
    public string Hello() {
      return "Hello,Mikky;)");
    }
  }
2) 如果作为产品发布,你还是在VS.NET中定义interface,然后让class实现interface.
using using MYCOMPLUSLib;
using System;
using System.Runtime.InteropServices;
namespace CSharpLib
{
interface ISimple
{
 string hello();
 string name();
}

[ClassInterface(ClassInterfaceType.None)]
public class MyClass:ISimple
{
public MyClass()
{
}
public static long Login(string Server,string User,string Pwd)
{
ISimpler DBXML=new SimplerClass ();

int Session = 0;
try
{
Session = DBXML.Login(Server, User, Pwd);
}
catch(Exception ex)
{
Session = -1;
}

return Session;

}

public string hello()
{
return "Hello ;)";
}

public string name()
{
return "I am Mikkey!";
}
}
}
posted on 2009-07-21 11:29  菡子  阅读(3840)  评论(1编辑  收藏  举报