ClassInterface
ClassInterface
类接口是未在托管代码中显式定义的接口,它将公开在 .NET 对象上显式公开的所有公共方法、属性、字段和事件。此接口可以是双绑定接口,也可以是仅调度接口。
• 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!";
}
}
}