My codebase (cpp) often calls separate dll functions with a precise schema: A pointer to the function type is created. A dll is loaded. A Resolve function is called with the called function name i.e.