是否有传统的URI方案用于引用库中的代码?

时间:2013-04-01 19:22:24

标签: objective-c dll shared-libraries uri uri-scheme

是否有标准或传统的URI方案,如file:http:,用于引用动态库中的对象?

例如,如果我以独特字符串的形式表示库中的函数,可用于查找该函数(通过任何反射方式),我该怎么做?

具体来说,我是在Objective-C中开发这个,我假设不同的语言/平台会有不同的表示形式(我知道.NET有它自己的),但是我对这一点有了更多的一般意义。

1 个答案:

答案 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并释放库。然而它并不好,因为:

  • 可能会发生返回值指向库内的资源然后将变得无用的

  • 相对于调用找到的函数,加载库和执行函数查找速度很慢

你做的是

  1. 加载库

  2. 加载您需要的功能

  3. 使用您的功能

  4. 释放图书馆

  5. 在这里,您需要一次引用多个符号,这需要比uri更复杂的方案。

    编辑:如果你想方便调用这样的函数你可以有一个幸存的FunctionCaller对象,它保存所有加载的模块,并包含从函数名到每个加载库的地址的映射。