2

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

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

具体来说,我正在用 Objective-C 开发它,并且我假设不同的语言/平台会有不同的表示形式(我知道 .NET 有自己的表示形式),但我对这个更普遍的意义感到好奇。

4

1 回答 1

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. 释放图书馆

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

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

于 2013-04-02T11:21:54.550 回答