www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Dynamically Loading a D DLL From a D Program

reply Benjiro <benjiro benjiro.com> writes:
Silly question: In this post about static / dynamic loading, i 
noticed that it uses the dlopen/dlclose, while there is a 
core.runtime for handling the loading.

http://dlang.org/dll-linux.html#dso9

Dynamically Loading a D DLL From a D Program

  void* lh = dlopen("libdll.so", RTLD_LAZY);

  // Do Stuff

  dlclose(lh);
Is it not better to use:
 import core.runtime : Runtime;

 void* lib = Runtime.loadLibrary(fileName);
 
 // Do Stuff

  Runtime.unloadLibrary(lib);
Is there also any information regarding d classes loading instead of functions? It also seems that the core runtime is incomplete with basic loading but no handling of dlsym, so your still forced to use the basic c conversion casting.
 int function() fn = cast(int function())dlsym(lib, libFunction);
 fn();
Dec 14 2016
next sibling parent Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Wednesday, 14 December 2016 at 21:38:27 UTC, Benjiro wrote:
 Silly question: In this post about static / dynamic loading, i 
 noticed that it uses the dlopen/dlclose, while there is a 
 core.runtime for handling the loading.

 http://dlang.org/dll-linux.html#dso9

 Dynamically Loading a D DLL From a D Program

  [...]
Is it not better to use:
  [...]
Is there also any information regarding d classes loading instead of functions? It also seems that the core runtime is incomplete with basic loading but no handling of dlsym, so your still forced to use the basic c conversion casting.
 [...]
There is also derelict shared lib loader in derelict-util in dub.
Dec 14 2016
prev sibling parent Guillaume Piolat <first.last gmail.com> writes:
On Wednesday, 14 December 2016 at 21:38:27 UTC, Benjiro wrote:
 It also seems that the core runtime is incomplete with basic 
 loading but no handling of dlsym, so your still forced to use 
 the basic c conversion casting.

 int function() fn = cast(int function())dlsym(lib, 
 libFunction);
 fn();
You can use the derelict-util library to load a dynlib portably. https://github.com/DerelictOrg/DerelictUtil/blob/2de2a9b63f8cdfbd8270afa8a4dc28f4ffaa868c/source/derelict/util/sharedlib.d#L110
Dec 15 2016