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
將錯誤描述轉換為可列印的訊息。