Промежуточная среда 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