Модуль Dynlink
module Dynlink: sig .. end
Динамическая загрузка файлов .cmo, .cma и .cmxs.
val is_native : bool
true если программа нативнная, false если программа на байткоде.
Динамическая загрузка скомпилированных файлов
val loadfile : string -> unit
В байткоде: загрузить указанный файл байткода (файл .cmo ) или файл байткода библиотеки (файл .cma ) и связать его с работающей программой. В нативном коде: загрузить указанный файл плагина OCaml (обычно .cmxs) и связать его с работающей программой.
Все выражения верхнего уровня в загруженных единицах компиляции вычисляются. Нет возможностей доступа к именам значений, определенных единицей. Поэтому единица должна сама регистрировать свои точки входа в основную программу (или в ранее загруженную библиотеку), например, изменяя таблицы функций.
Будет возбуждено исключение, если данная библиотека определяет модули верхнего уровня, имена которых конфликтуют с модулями, существующими либо в основной программе, либо в общей библиотеке, ранее загруженной с помощью loadfile. Модули из общих библиотек, ранее загруженных с помощью loadfile_private, в это ограничение не включены.
Единицы компиляции, загруженные этой функцией, добавляются в список «разрешенных единиц» (см. Dynlink.set_allowed_units).
val loadfile_private : string -> unit
То же, что и loadfile, за исключением того, что загруженные единицы компиляции скрыты (не могут быть обработаны) другими модулями, динамически загруженными позже.
Будет возбуждено исключение, если данная библиотека определяет модули верхнего уровня, имена которых конфликтуют с модулями, существующими либо в основной программе, либо в общей библиотеке, ранее загруженной с помощью loadfile. Модули из общих библиотек, ранее загруженные с помощью loadfile_private, в это ограничение не включены.
Также будет возбуждено исключение, если данная библиотека определяет модули верхнего уровня, имена которых совпадают с именами интерфейсов, от которых зависит модуль, существующий либо в основной программе, либо в общей библиотеке, ранее загруженной с помощью loadfile. Это относится даже к зависимостям «псевдонима модуля» (т.е. только по имени, а не по содержанию интерфейса).
Единицы компиляции, загруженные этой функцией, не добавляются в список «разрешенных единиц» (см. Dynlink.set_allowed_units), так как к ним нельзя обратиться из других единиц компиляции.
val adapt_filename : string -> string
В байткоде, функция тождества. В нативном коде, заменить последнюю расширение на .cmxs.
Управление доступом
val set_allowed_units : string list -> unit
Установить список единиц компиляции, к которым могут обращаться единицы, динамически загруженные в будущем, точно заданному значению.
Изначально все единицы компиляции, составляющие текущую запущенную программу, доступны для обработки динамически связанными единицами. set_allowed_units может использоваться для ограничения доступа к подмножеству этих единиц, например, к единицам, составляющим API для динамически связанного кода, и предотвращения доступа ко всем другим единицам, например, к частным, внутренним модулям запущенной программы.
Обратите внимание, что Dynlink.loadfile изменяет список разрешенных единиц.
val allow_only : string list -> unit
allow_only units устанавливает список разрешенных единиц, являющимся пересечением существующих разрешенных единиц и заданного списка единиц. Таким образом, он никогда не может увеличить набор разрешенных единиц.
val prohibit : string list -> unit
prohibit units запрещает динамически связанным единицам обращаться к единицам, указанным в списке units, удаляя такие единицы из списка разрешенных единиц. Это может использоваться для предотвращения доступа к выбранным единицам, например, к частным, внутренним модулям работающей программы.
val main_program_units : unit -> string list
Возвращает список единиц компиляции, составляющих основную программу (т.е. не динамически связанные).
val public_dynamically_loaded_units : unit -> string list
Возвращает список единиц компиляции, которые были динамически загружены через loadfile (и не через loadfile_private). Обратите внимание, что динамически загруженные единицы компиляции не могут быть разгружены.
val all_units : unit -> string list
Возвращает список единиц компиляции, составляющих основную программу вместе с единицами, которые были динамически загружены через loadfile (и не через loadfile_private).
val allow_unsafe_modules : bool -> unit
Определяет, разрешены ли небезопасные файлы объектов для динамической загрузки. Единица компиляции является «небезопасной», если она содержит объявления внешних функций, которые могут нарушить безопасность типов. По умолчанию динамическая загрузка небезопасных файлов объектов запрещена. В нативном коде эта функция ничего не делает; файлы объектов с внешними функциями всегда разрешены для динамической загрузки.
Обработка ошибок
type linking_error = private
|
| Undefined_global of
|
|
| of
|
|
| Uninitialized_global of
|
type error = private
|
| Not_a_bytecode_file of
|
|
| Inconsistent_import of
|
|
| of
|
|
| Unsafe_file
|
|
| Linking_error of
|
|
| Corrupted_interface of
|
|
| Cannot_open_dynamic_library of
|
|
| Library's_module_initializers_failed of
|
|
| Inconsistent_implementation of
|
|
| Module_already_loaded of
|
|
| Private_library_cannot_implement_interface of
|
exception Error of error
Ошибки динамической загрузки сообщаются путем возбуждения исключения Error с описанием ошибки. Распространённый случай — динамическая библиотека не найдена в системе: это сообщается через Cannot_open_dynamic_library (включенное исключение может быть платформозависимым).
val error_message : error -> string
Преобразовать описание ошибки в удобочитаемое сообщение.
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/Dynlink.html