是否有标准或传统的 URI 方案,例如file:
或http:
用于引用动态库中的对象?
例如,如果我要以唯一字符串的形式表示库中的一个函数,该字符串可用于查找该函数(通过任何反射方式),我该怎么做?
具体来说,我正在用 Objective-C 开发它,并且我假设不同的语言/平台会有不同的表示形式(我知道 .NET 有自己的表示形式),但我对这个更普遍的意义感到好奇。
是否有标准或传统的 URI 方案,例如file:
或http:
用于引用动态库中的对象?
例如,如果我要以唯一字符串的形式表示库中的一个函数,该字符串可用于查找该函数(通过任何反射方式),我该怎么做?
具体来说,我正在用 Objective-C 开发它,并且我假设不同的语言/平台会有不同的表示形式(我知道 .NET 有自己的表示形式),但我对这个更普遍的意义感到好奇。
不,符号的名称源自代码中的名称。在 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 对象,该对象保留所有加载的模块,并包含从函数名称到每个加载库的地址的映射。