Опубликован: 11.05.2007 | Доступ: свободный | Студентов: 1698 / 235 | Оценка: 4.36 / 4.25 | Длительность: 16:06:00
Лекция 7:

Промежуточная среда COM+ и служба Enterprise Services

Регистрация обслуживаемых компонент

Сборка, содержащая описание одного или нескольких классов компонент, должна быть зарегистрирована как приложение COM+ в каталоге COM+. Для этого сборка должна быть подписанной ( strong-named assembly ). Неподписанные сборки идентифицируются своим именем, версией и информацией о типе культуры. Подписанная сборка содержит также открытый ключ и цифровую подпись, созданную закрытым ключом. Таким образом, при наличии открытого ключа можно проверить неизменность кода сборки. Для генерации пары из закрытого и открытого ключа служит утилита sn.exe из .NET Framework SDK. Для создания сборки из приведенного выше файла SampleComponent.cs следует выполнить (или внести в make файл) следующие комманды.

sn -k SampleComponent.snk
csc /target:library /r:System.EnterpriseServices.dll SampleComponent.cs               
    /keyfile:SampleComponent.snk

После успешного создания подписанной сборки остается зарегистрировать ее в каталоге COM+. В .NET Framework существуют три способа регистрации обслуживаемых компонент:

  • с использованием класса System.EnterpriseServices.RegistrationHelper ;
  • c использованием утилиты regsvcs.exe ;
  • автоматическая регистрация сборки в момент создания экземпляра обслуживаемой компоненты.

Обычно рекомендуется применять первые два способа. Для регистрации созданной сборки выполняется следующая команда.

regsvcs SampleComponent.dll

Для удаления сборки из каталога COM+ выполняется аналогичная команда.

regsvcs /u SampleComponent.dll

В качестве примера использования созданной компоненты рассмотрим следующий файл.

// Файл SampleClient.cs
using System;
using ServicedComponentSample;

class Test
 {
   static public void Main()
    {
      using(SampleComponent com = new SampleComponent())
      {
          com.Do();      
      } 
    }
 } 
// SampleClient.cs

Использование оператора using приводит к вызову метода Dispose для объекта. Это необходимо для своевременной очистки используемых при создании обслуживаемой компоненты ресурсов COM+. Для компиляции данного файла следует следующую команду.

csc /target:exe /r:SampleComponent.dll SampleClient.cs

Для связывания этого приложения с компонентой на удаленном компьютере следует зарегистрировать на нем сборку SampleComponent.dll. Затем, пользуясь оснасткой comexp.msc на удаленном компьютере следует посредника приложения COM+, и установить посредника на компьютере клиента с исполняемым файлом SampleClient.exe. Следует отметить, что сборка может быть либо установлена в каталог COM+ в качестве локального приложения, либо как посредник приложения на удаленном компьютере, но не то и другое одновременно.

Использование исключений в обслуживаемых компонентах

Использование исключений в распределенных системах имеет свои особенности. Если исключение выбрасывается в обслуживаемой компоненте, то оно в общем случае может выйти за границы домена приложения компоненты, то есть подвергнуться сериализации и десериализации в рамках среды .NET Remoting с использованием класса BinaryFormatter. Поэтому все исключения, используемые обслуживаемыми компонентами, должны иметь возможность сериализации наследниками System.Runtime.Serialization.Formatter. Все исключения из библиотеки FCL, наследованные от System.ApplicationException и System.SystemException, имеют такую возможность. Ниже приведен пример создания собственного сериализуемого исключения. Класс исключения имеет конструктор с параметрами, описанными в теме об использовании форматеров SoapFormatter и BinaryFormatter. К счастью, разработчику достаточно вызвать аналогичный конструктор базового класса System.SystemException, который реализует все необходимые действия.

// Файл ComException.cs

using System;
using System.EnterpriseServices;
using System.Runtime.Serialization;

[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false)]

[Serializable]
public class CustomException:  System.ApplicationException
{ 
   public CustomException(SerializationInfo info, StreamingContext context):
       base(info, context)
   {
   }  
   public CustomException(string message): base(message)
   {
   }
}
 
public class ComSample: ServicedComponent
{
   public ComSample()
   {
   }
   
   public void Process()
   {
       throw new CustomException("случилась неприятность");
   }
}

class MainApp
{
   static public void Main()
   {
       ComSample com = new ComSample();
       try
       {         
          com.Process();
       }
       catch(CustomException e)       
       {
          Console.WriteLine("Исключение: {0}", e.Message);
       }
       finally
       {
          com.Dispose();  
       }        
   }
} // Файл ComException.cs

Для создания приложения и его регистрации можно выполнить следующие команды.

sn -k ComException.snk
csc ComException.cs /keyfile:ComException.snk /r:System.EnterpriseServices.dll
regsvcs ComException.exe