COM+的使用(转)
服务组件是用符合 CLS 的语言创作的类,该类直接或间接从 System.EnterpriseServices.ServicedComponent 类派生。以此方式配置的类可以在 COM+ 应用程序中承载,并且可以通过 EnterpriseServices 命名空间使用 COM+ 服务。有关受支持的服务列表,请参见可用的 COM+ 服务摘要。
COM+ 服务(例如自动事务处理或排队组件)都是可以声明方式配置的。在设计时应用与服务相关的属性,并创建使用这些服务的类的实例。配置某些服务的途径是在与服务相关的类或接口上调用方法。某些服务可以从一个对象流到另一个对象。例如,配置为要求事务的对象可以在第二个对象也支持或要求事务的情况下,将事务扩展到第二个对象。
COM+ 目录中包含配置信息,可以将该配置信息应用于类的实现。在运行时,COM+ 会根据您为代码提供的属性来创建上下文服务层。下面的插图显示了在 COM+ 承载的两个托管对象之间流动的自动事务处理。
创建服务组件
定义直接或间接从 ServicedComponent 类派生的类。例如,下面的代码确保 Account 类由 COM+ 应用程序承载。
[Visual Basic]
Imports System.EnterpriseServices
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
public class Account : ServicedComponent
{
static void Main()
{}
}
下面的代码将服务属性应用于程序集、类或方法。
[Visual Basic]
Imports System.EnterpriseServices
<Transaction(TransactionOption.Required)> Public Class Account
Inherits ServicedComponent
<AutoComplete()> Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
[AutoComplete]
static void Main()
{}
}
注意 在 .NET Framework 1.1 版中,如果程序集中不存在 ApplicationAccessControlAttribute 属性,则默认情况下启用 COM+ 安全配置。此行为与 .NET Framework 1.0 版中的不同。
可按如下所示编译该示例:
Makefile.bat
[Visual Basic]
vbc /t:exe /r:System.EnterpriseServices.dll Demo.vb
[C#]
csc /t:exe /r:System.EnterpriseServices.dll Demo.cs
通过动态或手动注册服务组件应用程序的程序集,来部署服务组件应用程序。有关更多信息,请参见动态注册和手动注册。
服务组件注册之后,客户端可以按照它们创建任何其他组件实例的方式来创建组件的实例。有关完整示例,请参见 Serviced 组件示例。
注意 在 Windows 2000 平台上,COM+ 总是为您创建的组件加载最新版本的公共语言运行库。这意味着在同时安装有 .NET Framework 1.0 版和 .NET Framework 1.1 版的计算机上,总是加载 .NET Framework 1.1 版。为解决此问题,可以创建 COM+ dllhost.exe 配置文件,它能将所有应用程序“锁定”到特定的 .NET Framework 版本。在 Windows XP 和 Windows Server 2003 平台上,可以使用“应用程序根目录”设置将 COM+ 指向相应的配置文件目录。
服务组件由 COM+ 应用程序承载,且必须对该应用程序是可访问的。为了便于访问,服务组件有下面的注册和配置要求:
程序集必须具有强名称。有关其他信息,请参见使用强名称为程序集签名。
程序集必须在 Windows 注册表中注册。
类型库定义必须注册并安装到特定的 COM+ 应用程序中。
以编程方式添加的服务必须在 COM+ 目录中配置。
对于服务组件有用的注册信息包括如下内容:
COM+ 应用程序标识
激活类型
说明信息
COM+ 应用程序标识
可以通过名称或 GUID 标识现有的 COM+ 目标应用程序。.NET 服务安装工具 (Regsvcs.exe) 提供 /appname: 选项,用于指定应用程序名。下面的示例说明如何使用程序集级的 ApplicationName 属性提供应用程序名。
[Visual Basic]
Imports System.EnterpriseServices
<assembly: ApplicationName( "BankComponent ")>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: ApplicationName( "BankComponent ")]
public class Account : ServicedComponent
{
static void Main()
{}
}
如果将 ApplicationID 属性(或 Guid 属性)应用到程序集,如下面的示例所示,则所有针对应用程序的搜索都基于该 GUID,而不基于应用程序名。
[Visual Basic]
Imports System.EnterpriseServices
<assembly: ApplicationName( "BankComponent ")>
< assembly: ApplicationID( "4fb2d46f-efc8-4643-bcd0-6e5bfa6a174c ")>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: ApplicationName( "BankComponent ")]
[ assembly: ApplicationID( "4fb2d46f-efc8-4643-bcd0-6e5bfa6a174c ")]
public class Account : ServicedComponent
{
static void Main() {}
}
注意 对于动态注册,指定目标应用程序的唯一方式是通过在设计时应用 ApplicationNameAttribute、ApplicationIDAttribute 或 GuidAttribute 属性。.NET 安装工具 (Regsvcs.exe) 提供 /appname: 开关,以在编译时指定应用程序名或 GUID。Regsvcs.exe 还提供 /parname: 开关来标识特定的 COM+ 分区。COM+ 分区服务仅在 Windows Server 2003 平台上可用。
如果目标应用程序未被识别或未找到,那么注册机制就会使用程序集的全名而不是版本号来创建应用程序。
警告 不要在 COM+ 分区服务中使用 ApplicationIDAttribute 属性。如果使用 COM+ 分区服务,应用 ApplicationIDAttribute 属性会防碍分区配置。COM+ 分区服务仅在 Windows Server 2003 平台上可用。
激活类型
激活类型确定服务组件是在调用方的进程(库)中还是在新进程(服务器)中创建的。可以应用 ApplicationActivationAttribute 属性来指定激活类型。
注意 如果 ApplicationActivationAttribute 属性设置为 Server,则在可以使用服务器应用程序之前,必须用 Windows 安装程序将程序集及其所依赖的所有程序集添加到全局程序集缓存 (GAC) 中;否则,应用程序将产生异常。此外,如果 ApplicationActivationAttribute 属性设置为 Server,则服务组件的任何参数都必须标记为 Serializable,或者必须从 MarshalByRefObject 类派生。否则,应用程序将产生异常。
下面的示例说明如何将激活类型设置为“server”。
[Visual Basic]
Imports System.EnterpriseServices
< assembly: ApplicationActivation(ActivationOption.Server)>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: ApplicationActivation(ActivationOption.Server)]
public class Account : ServicedComponent
{
static void Main() {}
}
说明信息
说明是可选的,但有时对于区分类似的程序集很有用。下面的示例说明如何应用 DescriptionAttribute 属性以设置有关程序集的说明。
[Visual Basic]
Imports System.EnterpriseServices
< assembly: Description( "BankComponent assembly ")>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: Description( "BankComponent assembly ")]
public class Account : ServicedComponent
{
static void Main()
{}
}
COM+ 服务(例如自动事务处理或排队组件)都是可以声明方式配置的。在设计时应用与服务相关的属性,并创建使用这些服务的类的实例。配置某些服务的途径是在与服务相关的类或接口上调用方法。某些服务可以从一个对象流到另一个对象。例如,配置为要求事务的对象可以在第二个对象也支持或要求事务的情况下,将事务扩展到第二个对象。
COM+ 目录中包含配置信息,可以将该配置信息应用于类的实现。在运行时,COM+ 会根据您为代码提供的属性来创建上下文服务层。下面的插图显示了在 COM+ 承载的两个托管对象之间流动的自动事务处理。
创建服务组件
定义直接或间接从 ServicedComponent 类派生的类。例如,下面的代码确保 Account 类由 COM+ 应用程序承载。
[Visual Basic]
Imports System.EnterpriseServices
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
public class Account : ServicedComponent
{
static void Main()
{}
}
下面的代码将服务属性应用于程序集、类或方法。
[Visual Basic]
Imports System.EnterpriseServices
<Transaction(TransactionOption.Required)> Public Class Account
Inherits ServicedComponent
<AutoComplete()> Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
[AutoComplete]
static void Main()
{}
}
注意 在 .NET Framework 1.1 版中,如果程序集中不存在 ApplicationAccessControlAttribute 属性,则默认情况下启用 COM+ 安全配置。此行为与 .NET Framework 1.0 版中的不同。
可按如下所示编译该示例:
Makefile.bat
[Visual Basic]
vbc /t:exe /r:System.EnterpriseServices.dll Demo.vb
[C#]
csc /t:exe /r:System.EnterpriseServices.dll Demo.cs
通过动态或手动注册服务组件应用程序的程序集,来部署服务组件应用程序。有关更多信息,请参见动态注册和手动注册。
服务组件注册之后,客户端可以按照它们创建任何其他组件实例的方式来创建组件的实例。有关完整示例,请参见 Serviced 组件示例。
注意 在 Windows 2000 平台上,COM+ 总是为您创建的组件加载最新版本的公共语言运行库。这意味着在同时安装有 .NET Framework 1.0 版和 .NET Framework 1.1 版的计算机上,总是加载 .NET Framework 1.1 版。为解决此问题,可以创建 COM+ dllhost.exe 配置文件,它能将所有应用程序“锁定”到特定的 .NET Framework 版本。在 Windows XP 和 Windows Server 2003 平台上,可以使用“应用程序根目录”设置将 COM+ 指向相应的配置文件目录。
服务组件由 COM+ 应用程序承载,且必须对该应用程序是可访问的。为了便于访问,服务组件有下面的注册和配置要求:
程序集必须具有强名称。有关其他信息,请参见使用强名称为程序集签名。
程序集必须在 Windows 注册表中注册。
类型库定义必须注册并安装到特定的 COM+ 应用程序中。
以编程方式添加的服务必须在 COM+ 目录中配置。
对于服务组件有用的注册信息包括如下内容:
COM+ 应用程序标识
激活类型
说明信息
COM+ 应用程序标识
可以通过名称或 GUID 标识现有的 COM+ 目标应用程序。.NET 服务安装工具 (Regsvcs.exe) 提供 /appname: 选项,用于指定应用程序名。下面的示例说明如何使用程序集级的 ApplicationName 属性提供应用程序名。
[Visual Basic]
Imports System.EnterpriseServices
<assembly: ApplicationName( "BankComponent ")>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: ApplicationName( "BankComponent ")]
public class Account : ServicedComponent
{
static void Main()
{}
}
如果将 ApplicationID 属性(或 Guid 属性)应用到程序集,如下面的示例所示,则所有针对应用程序的搜索都基于该 GUID,而不基于应用程序名。
[Visual Basic]
Imports System.EnterpriseServices
<assembly: ApplicationName( "BankComponent ")>
< assembly: ApplicationID( "4fb2d46f-efc8-4643-bcd0-6e5bfa6a174c ")>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: ApplicationName( "BankComponent ")]
[ assembly: ApplicationID( "4fb2d46f-efc8-4643-bcd0-6e5bfa6a174c ")]
public class Account : ServicedComponent
{
static void Main() {}
}
注意 对于动态注册,指定目标应用程序的唯一方式是通过在设计时应用 ApplicationNameAttribute、ApplicationIDAttribute 或 GuidAttribute 属性。.NET 安装工具 (Regsvcs.exe) 提供 /appname: 开关,以在编译时指定应用程序名或 GUID。Regsvcs.exe 还提供 /parname: 开关来标识特定的 COM+ 分区。COM+ 分区服务仅在 Windows Server 2003 平台上可用。
如果目标应用程序未被识别或未找到,那么注册机制就会使用程序集的全名而不是版本号来创建应用程序。
警告 不要在 COM+ 分区服务中使用 ApplicationIDAttribute 属性。如果使用 COM+ 分区服务,应用 ApplicationIDAttribute 属性会防碍分区配置。COM+ 分区服务仅在 Windows Server 2003 平台上可用。
激活类型
激活类型确定服务组件是在调用方的进程(库)中还是在新进程(服务器)中创建的。可以应用 ApplicationActivationAttribute 属性来指定激活类型。
注意 如果 ApplicationActivationAttribute 属性设置为 Server,则在可以使用服务器应用程序之前,必须用 Windows 安装程序将程序集及其所依赖的所有程序集添加到全局程序集缓存 (GAC) 中;否则,应用程序将产生异常。此外,如果 ApplicationActivationAttribute 属性设置为 Server,则服务组件的任何参数都必须标记为 Serializable,或者必须从 MarshalByRefObject 类派生。否则,应用程序将产生异常。
下面的示例说明如何将激活类型设置为“server”。
[Visual Basic]
Imports System.EnterpriseServices
< assembly: ApplicationActivation(ActivationOption.Server)>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: ApplicationActivation(ActivationOption.Server)]
public class Account : ServicedComponent
{
static void Main() {}
}
说明信息
说明是可选的,但有时对于区分类似的程序集很有用。下面的示例说明如何应用 DescriptionAttribute 属性以设置有关程序集的说明。
[Visual Basic]
Imports System.EnterpriseServices
< assembly: Description( "BankComponent assembly ")>
Public Class Account
Inherits ServicedComponent
Shared Sub Main()
End Sub
End Class
[C#]
using System.EnterpriseServices;
[ assembly: Description( "BankComponent assembly ")]
public class Account : ServicedComponent
{
static void Main()
{}
}