是否有标准或传统的URI方案,如file:
或http:
,用于引用动态库中的对象?
例如,如果我以独特字符串的形式表示库中的函数,可用于查找该函数(通过任何反射方式),我该怎么做?
具体来说,我是在Objective-C中开发这个,我假设不同的语言/平台会有不同的表示形式(我知道.NET有它自己的),但是我对这一点有了更多的一般意义。
答案 0 :(得分:1)
不,符号的名称是从代码中的名称派生的。在Windows中,您将假设C或C ++
HMODULE module=LoadLibrary( [path to your dll] );
//If the exported name is foo.
Function foo=(Function)GetProcAddress(module,"foo");
//Call function
foo();
FreeLibrary(module);
导出的名称取决于编译器。
非常这样的命名方案是没用的。在C ++中,你可以使用类似的东西(注意每个函数原型你将有一个FunctionCaller)
FunctionCaller("your-dll.dll/foo")();
当FunctionCaller的构造函数加载库时,调用foo并释放库。然而它并不好,因为:
可能会发生返回值指向库内的资源然后将变得无用的
相对于调用找到的函数,加载库和执行函数查找速度很慢
你做的是
加载库
加载您需要的功能
使用您的功能
释放图书馆
在这里,您需要一次引用多个符号,这需要比uri更复杂的方案。
编辑:如果你想方便调用这样的函数你可以有一个幸存的FunctionCaller对象,它保存所有加载的模块,并包含从函数名到每个加载库的地址的映射。