IDL
Все реализуемые в решении интерфейсы необходимо описать в IDL-файлах.
В каждом IDL-файле может быть объявлен только один интерфейс.
Имя IDL-файла должно совпадать с именем интерфейса, который он описывает.
IDL-файл содержит следующие разделы:
- Имя интерфейса.
Единственный обязательный раздел.
Имя интерфейса должно начинаться с заглавной буквы и не может содержать символ подчеркивания (_).
Объявление имени имеет следующий формат:
package <имя описываемого интерфейса>
Имя интерфейса может быть составным. В этом случае оно используется для формирования пути к IDL-файлу, например:
/* Module.idl расположен по следующему пути: a/b/c/Module.idl */
package a.b.c.Module
- Импорт внешних пакетов.
Инструкция импорта пакета имеет следующий формат:
import <имя внешнего пакета>
Позволяет ввести в область видимости IDL-файла элементы внешнего пакета: именованные константы и пользовательские типы, включая структуры и вариантные типы.
- Объявление структур, вариантных типов, именованных констант и синонимов.
- Объявление методов интерфейса.
Объявление методов интерфейса имеет следующий синтаксис:
interface {
<Объявления методов>
}
Внутри фигурных скобок находятся объявления методов, имеющие следующий синтаксис:
<Имя метода> (<аргументы>);
Имя метода не может содержать символ подчеркивания (_). Рекомендуется начинать имена методов с заглавной буквы.
Аргументы разделяются на входные (
in
) и выходные (out
) и перечисляются через запятую. Пример объявления интерфейса:interface {
// Объявление метода Ping
Ping(in UInt32 value, out UInt32 result);
}
Для возврата кодов ошибок, возникающих в результате обработки запроса сущностью-сервером, не рекомендуется использовать
out
-аргументы. Вместо них рекомендуется использовать специальныеerror
-аргументы. Подробнее см. Работа с ошибками в IDL.
IDL поддерживает однострочные и многострочные комментарии в стиле C++.
Примеры IDL-файлов
В простейшем случае IDL-описание содержит только имя и объявление интерфейса:
Ping.idl
/* Ping — имя интерфейса */
package Ping
/* Объявление методов интерфейса */
interface {
// Объявление метода Ping
Ping(in UInt32 value, out UInt32 result);
}
Пример более сложного IDL-описания:
Foo.idl
// Объявление имени
package Foo
// Инструкции импорта
import Bar1
import Bar2
// Объявление именованной константы
const UInt32 MaxStringSize = 1024;
// Объявление синонима для пользовательского типа
typedef sequence <Char, MaxStringSize> String;
// Объявление структуры
struct BazInfo {
Char x;
array <String, 100> y;
sequence <sequence <UInt32, 100>, 200> y;
}
// Объявление методов интерфейса
interface {
Baz(in BazInfo a, out UInt32 b);
}