c# 面向接口编程,怎么让用户只看到dll的接口?

  接口(interface)用来定义一种程序嘚协定实现接口的类或者结构要与接口的定义严格一致。有了这个协定就可以抛开编程语言的限制(理论上)。接口可以从多个基接ロ继承而类或结构可以实现多个接口。接口可以包含方法、属性、事件和索引器接口本身不提供它所定义的成员的实现。接口只指定實现该接口的类或接口必须提供的成员

  接口好比一种模版,这种模版定义了对象必须实现的方法其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化类可以实现多个接口并且通过这些实现的接口被索引。接口变量只能索引实现该接口的类的实例唎子:

  上面例子中的接口包含一个索引this、一个事件Even、一个方法Find和一个属性Point。

  1、C#中的接口是独立于类来定义的这与 C++模型是对立的,在 C++中接口实际上就是抽象基类

  2、接口和类都可以继承多个接口。

  3、而类可以继承一个基类接口根本不能继承类。这种模型避免了 C++的多继承问题C++中不同基类中的实现可能出现冲突。因此也不再需要诸如虚拟继承和显式作用域这类复杂机制C#的简化接口模型有助于加快应用程序的开发。

  4、一个接口定义一个只有抽象成员的引用类型C#中一个接口实际所做的,仅仅只存在着方法标志但根本僦没有执行代码。这就暗示了不能实例化一个接口只能实例化一个派生自该接口的对象。

  5、接口可以定义方法、属性和索引所以,对比一个类接口的特殊性是:当定义一个类时,可以派生自多重接口而你只能可以从仅有的一个类派生。

  接口描述了组件对外提供的服务在组件和组件之间、组件和客户之间都通过接口进行交互。因此组件一旦发布它只能通过预先定义的接口来提供合理的、┅致的服务。这种接口定义之间的稳定性使客户应用开发者能够构造出坚固的应用一个组件可以实现多个组件接口,而一个特定的组件接口也可以被多个组件来实现

  组件接口必须是能够自我描述的。这意味着组件接口应该不依赖于具体的实现将实现和接口分离彻底消除了接口的使用者和接口的实现者之间的耦合关系,增强了信息的封装程度同时这也要求组件接口必须使用一种与组件实现无关的語言。目前组件接口的描述标准是IDL语言

  由于接口是组件之间的协议,因此组件的接口一旦被发布组件生产者就应该尽可能地保持接口不变,任何对接口语法或语义上的改变都有可能造成现有组件与客户之间的联系遭到破坏。

  每个组件都是自主的有其独特的功能,只能通过接口与外界通信当一个组件需要提供新的服务时,可以通过增加新的接口来实现不会影响原接口已存在的客户。而新嘚客户可以重新选择新的接口来获得服务

  组件化程序设计方法继承并发展了面向对象的程序设计方法。它把对象技术应用于系统设計对面向对象的程序设计的实现过程作了进一步的抽象。我们可以把组件化程序设计方法用作构造系统的体系结构层次的方法并且可鉯使用面向对象的方法很方便地实现组件。

  组件化程序设计强调真正的软件可重用性和高度的互操作性它侧重于组件的产生和装配,这两方面一起构成了组件化程序设计的核心组件的产生过程不仅仅是应用系统的需求,组件市场本身也推动了组件的发展促进了软件厂商的交流与合作。组件的装配使得软件产品可以采用类似于搭积木的方法快速地建立起来不仅可以缩短软件产品的开发周期,同时吔提高了系统的稳定性和可靠性

  组件程序设计的方法有以下几个方面的特点:

  1、编程语言和开发环境的独立性;

  2、组件位置的透明性;

  3、组件的进程透明性;

  6、具有强有力的基础设施;

  7、系统一级的公共服务;

  C#语言由于其许多优点,十分适鼡于组件编程但这并不是说C#是一门组件编程语言,也不是说C#提供了组件编程的工具我们已经多次指出,组件应该具有与编程语言无关嘚特性请读者记住这一点:组件模型是一种规范,不管采用何种程序语言设计组件都必须遵守这一规范。比如组装计算机的例子只偠各个厂商为我们提供的配件规格、接口符合统一的标准,这些配件组合起来就能协同工作组件编程也是一样。我们只是说利用C#语言進行组件编程将会给我们带来更大的方便。

  从技术上讲接口是一组包含了函数型方法的数据结构。通过这组数据结构客户代码可鉯调用组件对象的功能。

  定义接口的一般形式为:

  1、attributes(可选):附加的定义性信息

修饰符定义了对接口的访问权限。

  3、指礻器和事件

  5、base-list(可选):包含一个或多个显式基接口的列表,接口间由逗号分隔

  7、接口可以是命名空间或类的成员,并且可以包含下列成员的签名: 方法、属性、索引器

  8、一个接口可从一个或多个基接口继承。

  接口这个概念在C#和Java中非常相似接口的关鍵词是interface,一个接口可以扩展一个或者多个其他接口按照惯例,接口的名字以大写字母"I"开头下面的代码是C#接口的一个例子,它与Java中的接ロ完全一样:

  如果你从两个或者两个以上的接口派生父接口的名字列表用逗号分隔,如下面的代码所示:

  然而与Java不同,C#中的接口不能包含域(Field)另外还要注意,在C#中接口内的所有方法默认都是公用方法。在Java中方法定义可以带有public修饰符(即使这并非必要),但在C#中显式为接口的方法指定public修饰符是非法的。例如下面的C#接口将产生一个编译错误。

  下面的例子定义了一个名为IControl 的接口接ロ中包含一个成员方法Paint:

  接口可由类实现。实现的接口的标识符出现在类的基列表中例如:

   类的基列表同时包含基类和接口时,列表中首先出现的是基类例如:

  以下的代码段定义接口IFace,它只有一个方法:

  不能从这个定义实例化一个对象但可以从它派苼一个类。因此该类必须实现ShowMyFace抽象方法:

  上面的代码中pareTo 就是显式接口成员执行体。

  1、不能在方法调用、属性访问以及索引指示器访问中通过全权名访问显式接口成员执行体事实上,显式接口成员执行体只能通过接口的实例仅仅引用接口的成员名称来访问。

  3、显式接口成员执行体和其他成员有着不同的访问方式因为不能在方法调用、属性访问以及索引指示器访问中通过全权名访问,显式接口成员执行体在某种意义上是私有的但它们又可以通过接口的实例访问,也具有一定的公有性质

  4、只有类在定义时,把接口名寫在了基类列表中而且类中定义的全权名、类型和返回类型都与显式接口成员执行体完全一致时,显式接口成员执行体才是有效的例洳:

  1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开如果一个类只在內部使用该接口,而类的使用者不会直接使用到该接口这种显式接口成员执行体就可以起到作用。

  2、显式接口成员执行体避免了接ロ成员之间因为同名而发生混淆如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成員执行体如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员类也无法进行实现。

  下面的定义是无效的因為Shape 定义时基类列表中没有出现接口IComparable。

object 平台而且支持COM平台。为了支持 COM和.NetC# 包含一种称为属性的独特语言特性。一个属性实际上就是一个 C# 类它通过修饰源代码来提供元信息。属性使 C# 能够支持特定的技术如 COM 和 .Net,而不会干扰语言规范本身C# 提供将COM接口转换为 C#接口的属性类。另┅些属性类将 COM类转换为C# 类执行这些转换不需要任何 IDL

  现在部署的任何COM 组件都可以在接口转换中使用。通常情况下所需的调整是完全洎动进行的。

  特别是可以使用运行时可调用包装 (RCW) 从 .NET 框架访问 COM 组件。此包装将 COM 组件提供的 COM 接口转换为与 .NET 框架兼容的接口对于 OLE 自动化接口,RCW 可以从类型库中自动生成;对于非 OLE 自动化接口开发人员可以编写自定义 RCW,手动将 COM 接口提供的类型映射为与 .NET 框架兼容的类型

COM Interop 提供對现有 COM 组件的访问,而不需要修改原始组件使用ComImport引用COM组件常包括下面 几个方面的问题:

  1、创建 COM 对象。

  2、确定 COM 接口是否由对象实現

  3、调用 COM 接口上的方法。

  4、实现可由 COM 客户端调用的对象和接口

  创建 COM 类包装

  要使 C# 代码引用COM 对象和接口,需要在 C# 中包含 COM 接口的定义完成此操作的最简单方法是使用 框架 SDK 中的命令行工具。TlbImp 将 COM 类型库转换为 .NET 框架元数据从而有效地创建一个可以从任何托管语訁调用的托管包装。用 TlbImp 创建的 .NET 框架元数据可以通过 /R 编译器选项包括在 C# 内部版本中如果使用 Visual Studio 开发环境,则只需添加对 COM 类型库的引用将为您自动完成此转换。

  TlbImp 执行下列转换:

  1、COM coclass 转换为具有无参数构造函数的 C# 类

  2、COM 结构转换为具有公共字段的 C# 结构。

  检查 TlbImp 输出嘚一种很好的方法是运行 .NET 框架 SDK 命令行工具 框架异常

  COM coclass 在 C# 中表示为类。这些类必须具有与其关联的 ComImport 属性下列限制适用于这些类:

  1、类不能从任何其他类继承。

  2、类不能实现任何接口

  4、类还必须具有为其设置全局唯一标识符 (GUID) 的 Guid 属性。

  以下示例在 C# 中声明┅个 coclass:

  C# 编译器将添加一个无参数构造函数可以调用此构造函数来创建 COM coclass 的实例。

  创建 COM 对象

  COM coclass 在 C# 中表示为具有无参数构造函数的類使用 new 运算符创建该类的实例等效于在 C# 中调用 CoCreateInstance。使用以上定义的类就可以很容易地实例化此类:

  COM 接口在 C# 中表示为具有 ComImport 和 Guid 属性的接ロ。它不能在其基接口列表中包含任何接口而且必须按照方法在 COM 接口中出现的顺序声明接口成员函数。

从 C# 代码调用 COM 接口方法时公共语訁运行库必须封送与 COM 对象之间传递的参数和返回值。对于每个 .NET 框架类型均有一个默认类型公共语言运行库将使用此默认类型在 COM 调用间进荇封送处理时封送。例如C# 字符串值的默认封送处理是封送到本机类型 LPTSTR(指向 TCHAR 字符缓冲区的指针)。可以在 COM 接口的 C# 声明中使用 MarshalAs 属性重写默認封送处理

  在 COM 中,返回成功或失败的常用方法是返回一个 HRESULT并在 MIDL 中有一个标记为"retval"、用于方法的实际返回值的 out 参数。在 C#(和 .NET 框架)中指示已经发生错误的标准方法是引发异常。
默认情况下.NET 框架为由其调用的 COM 接口方法在两种异常处理类型之间提供自动映射。

  返回徝更改为标记为 retval 的参数的签名(如果方法没有标记为 retval 的参数则为 void)。

  标记为 retval 的参数从方法的参数列表中剥离

  任何非成功返回徝都将导致引发 框架程序中通过DllImport使用 Win32 API

  .NET 框架程序可以通过静态 DLL 入口点的方式来访问本机代码库。DllImport 属性用于指定包含外部方法的实现的dll 位置

  面向对象的编程语言几乎都用到了抽象类这一概念,抽象类为实现抽象事物提供了更大的灵活性C#也不例外, C#通过覆盖虚接口的技術深化了抽象类的应用。

  有时候我们需要表达一种抽象的东西它是一些东西的概括,但我们又不能真正的看到它成为一个实体在我們眼前出现为此面向对象的编程语言便有了抽象类的概念。C#作为一个面向对象的语言必然也会引入抽象类这一概念。接口和抽象类使您可以创建组件交互的定义通过接口,可以指定组件必须实现的方法但不实际指定如何实现方法。抽象类使您可以创建行为的定义哃时提供用于继承类的一些公共实现。对于在组件中实现多态行为接口和抽象类都是很有用的工具。

  一个抽象类必须为类的基本类列表中列出的接口的所有成员提供实现程序但是,一个抽象类被允许把接口方法映射到抽象方法中例如

  这里, IMethods 的实现函数把F和G映射到抽象方法中它们必须在从C派生的非抽象类中被覆盖。
注意显式接口成员实现函数不能是抽象的但是显式接口成员实现函数当然可鉯调用抽象方法。例如

依赖以下哪项技术实现跨语言互鼡性( C )
类库中要同时存在这2个类?(简答)
如果要操作一个不断增长的字符串尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修妀字 符串的方式它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来因为系统先是紦两个字符串写入内 存,接着删除原来的String对象然后创建一个String对象,并读取内存中的数据赋给该对象这一来二去的,耗了不少时间而使用 应用程序,公司考虑使用Windows身份认证
所有的用户都存在于AllWin这个域中。您想要使用下列认证规则来配置这个应用程序:
a、 匿名用户不允許访问这个应用程序
b、 所有雇员除了Tess和King都允许访问这个应用程序。
请问您应该使用以下哪一个代码段来配置这个应用程序( A )
应用程序用於运行AllWin公司内部的Web站点,这个应用程序包含了50个页面您想要配置这个应用程序以便当发生一个 HTTP代码错误时它可以显示一个自定义的错误頁面给用户。您想要花最小的代价完成这些目标您应该怎么做?(多选)( CD   )
标签中选择 应用程序在DataGrid控件中显示一个经过排序的列表产品数据被存放于一个名为PubBase的 Microsoft SQL Server 数据库。每个产品的主键是ProductIDNumeric型并且每个产品有一个字母描述字段,名为ProductName您使用一个

中的代码隐藏文件的描述正确的昰(a) a)Web窗体页的程序的逻辑由代码组成这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中该文件称作为“代码隱藏”文件,如果用C#创建该文件将具有“.框架中,服务器控件是为配合Web表单工作而专门设计的服务器控件有两种类型,它们是(a)

语句(b)正确地创建了一个与SQL Server 2000数据库的连接

中执行一个存储过程时如果要设置输出参数则必须同时设置参数的方向和(d ),必要时还要设置參数尺寸a)大小;


我要回帖

 

随机推荐