服务组件示例

下面的示例是一个由客户端和服务器两部分组成的服务组件。在该示例中,Account 类派生自 ServicedComponent 类,这样可确保 Account 对象的上下文在 COM+ 中承载。此示例中应用了以下属性:

  • TransactionAttribute   应用于 Account 类,以便将事务设置为 Required,此操作相当于使用 Windows“控制面板”中的“组件服务”管理工具设置 COM+ 组件支持的事务。

  • AutoCompleteAttribute   应用于 Post 方法。此属性指示,如果在执行该方法期间生成未处理的异常,则运行库自动对事务调用 SetAbort 函数;否则,运行库调用 SetComplete 函数。

除此示例中使用的属性外,还有许多程序集级别的属性也用于提供 COM+ 注册信息。对于手动注册,服务组件必须具有强名称,并且应该置于全局程序集缓存 (GAC) 中。有关程序集的其他信息,请参阅Strong-Named Assemblies

Note注意:

置于 GAC 中的程序集不能使用动态注册。如果创建了服务器应用程序,那么要想使用该服务器应用程序,必须用 Windows Installer 将程序集及其所依赖的所有程序集添加到 GAC 中;否则,该应用程序将生成异常。

BankComponent 服务器

Imports System.EnterpriseServices
Imports System.Runtime.CompilerServices
Imports System.Reflection

' Supply the COM+ application name. 
<assembly: ApplicationName("BankComponent")>
' Supply a strong-named assembly.
<assembly: AssemblyKeyFileAttribute("BankComponent.snk")>

Namespace BankComponent
      <Transaction(TransactionOption.Required)> _
      Public Class Account 
Inherits ServicedComponent
            <AutoComplete()> _
            Public Sub  Post(accountNum As Integer, amount As Double)
                  ' Updates the database; no need to call SetComplete.
                  ' Calls SetComplete automatically if no exception is generated.
            End Sub 
      End Class 
End Namespace 
using System.EnterpriseServices;
using System.Runtime.CompilerServices;
using System.Reflection;

// Supply the COM+ application name.
[assembly: ApplicationName("BankComponent")]
// Supply a strong-named assembly.
[assembly: AssemblyKeyFileAttribute("BankComponent.snk")]

namespace BankComponent
{
      [Transaction(TransactionOption.Required)]
      public class Account : ServicedComponent
      {
            [AutoComplete] 
            public bool Post(int accountNum, double amount)
            {
                /* Updates the database; no need to call SetComplete.
                   Calls SetComplete automatically if no exception is
                   generated. */
            return false;     
            } 
      }
}

BankComponent 客户端

Imports BankComponent
Public Class Client 
   Shared Sub Main()
      Dim Account As New Account()
      ' Post money into the account. 
      Account.Post(5, 100)
   End Sub
End Class
using BankComponent;
namespace BankComponentConsoleClient
{
      class Client
      {
            public static int Main() 
            {
                  try
                  {
                        Account act = new Account();
                        // Post money into the account.
                        act.Post(5, 100);
                        return(0);
                  }
                  catch
                  {
                        return(1);
                  }
            }
      }
}

Makefile.bat

可以按如下所示编译服务器和客户端:

sn –k BankComponent.snk
vbc /t:library /r:System.EnterpriseServices.dll Bank.vb
vbc /r:Bank.dll /r:System.EnterpriseServices.dll BankClient.vb
sn –k BankComponent.snk
csc /t:library /r:System.EnterpriseServices.dll Bank.cs
csc /r:Bank.dll BankClient.cs

请参见

任务

如何:创建服务组件

参考

ServicedComponent
System.EnterpriseServices Namespace

概念

服务组件概述
应用属性以配置 COM+ 服务
注册服务组件
可用的 COM+ 服务摘要

其他资源

编写服务组件

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。