[gregor@gdeskgor test]$ cat so.d import std.stdio; import std.gc; class Foo { this() { a = 3; } int a; } extern(C) Foo mkfoo() { return new Foo(); } extern(C) void foocollect() { std.gc.fullCollect(); } extern(C) void usefoo(Foo a) { writefln("%d", a.a); } [gregor@gdeskgor test]$ cat getso.d import std.stdio; import std.string; import std.gc; extern (C) void *dlopen(char *, int); extern (C) char *dlerror(); extern (C) void *dlsym(void *, char *); extern (C) void perror(char *); int main() { void *hnd = dlopen("so.d.so", 2); Object function() mkfoo = cast(Object function()) dlsym(hnd, "mkfoo"); void function() foocollect = cast(void function()) dlsym(hnd, "foocollect"); void function(Object) usefoo = cast(void function(Object)) dlsym(hnd, "usefoo"); Object foo = mkfoo(); std.gc.fullCollect(); foocollect(); usefoo(foo); return 0; } [gregor@gdeskgor test]$ gdc -fPIC -shared -nostdlib so.d -o so.d.so [gregor@gdeskgor test]$ gdc -rdynamic -ldl getso.d -o getso [gregor@gdeskgor test]$ LD_LIBRARY_PATH=. ./getso 3