问题标签 [dynamic-loading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
446 浏览

javascript - iframe 中包含的 JS 具有顶部框架窗口的上下文

如果我错了,请纠正我,但我认为应该将 JS 加载到 iframe 中。我也尝试过附加到head.

问题
javascript.js已执行,但console.debug(this)在该脚本中返回顶部框架窗口。我试图验证该脚本实际上是否包含在 iframe 中,但不知道如何。

萤火虫输出

此外,运行$('a')fromjavascript.js返回顶部框架中的所有链接,而不是我想要的 iframe 中的每个链接。

谢谢你的时间!


更新:我整理了一个独立的测试用例您也可以下载. 检查控制台并注意这是顶部框架(可以通过变量_TOP 验证)。

0 投票
1 回答
892 浏览

.net - 如何管理运行时加载的 dll 版本?

一点背景:

我有一个库项目 A,其中包含大量数据和一些托管 DLL。这个项目有自己的安装程序(由于它的大小),可以独立安装。

然后我有一些其他项目,当他们检测到项目 A 也已安装时,它们可以提供额外的功能。

设置:我创建了一个 Interface.dll,其中包含由项目 A 实现的接口。所有其他项目都包含此 DLL,因此我可以在运行时加载项目 A 并将其转换为特定接口。

版本控制会出现问题。有时某些项目将包含较新版本的 Interface.dll,而安装的项目 A 依赖于旧版本。发生这种情况时,我的演员表不再起作用。

我正在考虑一些可能性:

  1. 抛弃 interface.dll 并动态加载所有内容。
  2. 一些版本检测并通知用户更新他的项目 A 的版本。
  3. 使用其他一些通信方式(例如命令行)
0 投票
3 回答
16940 浏览

c# - 实现插件架构 - 动态 DLL 加载

我有一个应用程序,它基本上是一个带有预加载控件的设计器,您可以在其中使用控件设计页面。

我计划在未来发布越来越多的控件。我不想为新添加的控件发布新版本,因为它有其缺点。所以我在考虑插件/插件类型的架构,我只需单独发布插件/插件,他们可以安装并获取设计器内部的控件。

现在,我使用 xml 文件作为插件来指定控件、其行为、样式等。每个 xml(插件)代表一个控件。但是我发现实现这一点非常困难,因为我必须编写一个通用解析器来读取所有插件。

相反,我可以为每个插件发布一个 dll,让我有更多的控制权来编写代码来定义控件的行为/外观并通过主引擎动态加载它吗?如果是这样,我如何检查 dll 并将其动态加载到我的应用程序中?

0 投票
1 回答
3302 浏览

linux - dlopen() .so 无法在剥离的可执行文件中找到符号

我在linux中有一个可执行文件-exe

这个可执行文件中有一些函数,在整个代码中都使用:

  • sendMsg
  • debugPrint

然后我想动态加载一个.so为我的可执行文件提供额外功能的。

在这个共享库中,我包含了sendMsg和的标题debugPrint

我加载这个共享库dlopen()并使用dlsym().

但是,dlopen()我使用RTLD_NOW在加载时解析所有符号。

它未能说明它找不到sendMsg符号。

该符号必须在可执行文件中,因为在其中sendMsg.c编译。

但是,我的可执行文件被该make进程剥离。因此,dlopen找不到符号是有道理的。

我该如何解决这种情况?

  • 我可以将共享函数构建到一个静态库中,并将该静态库链接exe.so. 这会增加代码大小:(
  • 我可以删除剥离的exe所以可以找到符号
  • 做一些我不知道的编译时链接魔术,以便.so知道符号在哪里exe
0 投票
3 回答
2560 浏览

dynamic-linking - 动态加载:共享静态库中的未定义符号

我有一个加载.so插件的可执行文件。

可执行文件被链接,-rdynamic以便可以发生符号回调。

我有一个包含在可执行文件中的静态库。这有一个BLAH_hello().a

可执行文件中不使用静态库。BLAH_hello()即在可执行代码中没有调用。

但是,.so确实有调用BLAH_hello().

当我抱怨一个未定义的符号dlopen().soBLAH_hello()

如果BLAH_hello()我在可执行代码中包含一个虚拟调用,例如BLAH_hello(NULL);. 该符号包含在可执行文件中,并且在.so加载时会找到该符号。

我确信我也可以将 ' 链接到.so.a多个动态加载.so的 ' 使用BLAH_hello调用,因此将它放在可执行文件中是有意义的。如果我将库链接到每个.so.

所以我想知道的是,.a即使它们实际上并未在可执行文件中使用,如何将它们的符号放入可执行文件中?

0 投票
3 回答
5474 浏览

c# - 如何从 C++ DLL 动态加载 C# dll

我有一个 C++ 应用程序。这支持用户的 C++ 插件 DLL,它将动态加载这些 DLL,然后能够动态创建和使用用户的类型。这些用户类型派生自主应用程序核心库中定义的基类型和接口,因此我将用户对象作为指向基类的指针,并调用用户的虚函数来实现它们的魔力。

现在我想扩展插件 DLL 以允许托管 DLL(我主要关心 C#)。我希望所有相同的魔法都发生在 C# 插件 DLL 中。

如何动态加载这些 dll,我认为我目前正在使用的 win32 的 LoadLibrary 会对托管 DLL 感到满意。我将无法在编译/链接时访问这些库,它们来自用户。

在我加载库之后,不幸的是,我怀疑 COM 在我的未来是调用派生函数的方式。可能我可以使用我一直在阅读的 CLI/C++ 包装器,但我在这里非常缺乏经验,如果有任何建议或指向适当文章的链接,我将不胜感激。

0 投票
2 回答
144 浏览

c# - 从几个 dll 文件中动态加载 UIView

我的项目中有一个导航控制器。现在我想从不同的 dll 文件加载视图,并将它们添加到导航控制器中。我不确定这是否可能。如果可能的话,我该怎么做?如何为每个视图创建单独的 dll?

请注意,我使用的是 Monotouch 和 C#。

0 投票
2 回答
983 浏览

embedded - 加载时间基地址 cortex-m3 裸机

我正在开发一个带有裸机环境的 cortex-m3 CPU 项目。由于软件升级需要,CPU 上的可执行映像可能位于闪存中的两个地址之一,这会带来问题。映像的起始地址仅在加载时才知道,而在静态链接期间不知道。我不太确定,但我认为这并不真正符合动态加载的条件,但我在这里真的可能被误认为,因为我不是这方面的专家。有没有办法编译和链接图像,因为它的基地址只能在加载时给出,因为没有操作系统也没有动态加载器?

0 投票
2 回答
2985 浏览

mysql - 错误消息“未加载库:libmysqlclient.18.dylib”的原因是什么?

我没有使用 Perl 的经验,我正在尝试为我正在处理的项目运行geo_to_mysql.pl程序。除了前几行中的数据库、用户名、密码和文件目录路径外,我没有对程序进行任何修改。

运行程序时,我不断收到此错误:

install_driver(mysql) 失败:无法为模块 DBD::mysql 加载 '/Library/Perl/5.10.0/darwin-thread-multi-2level/auto/DBD/mysql/mysql.bundle': dlopen(/Library/ Perl/5.10.0/darwin-thread-multi-2level/auto/DBD/mysql/mysql.bundle,1):库未加载:libmysqlclient.18.dylib

引用自:/Library/Perl/5.10.0/darwin-thread-multi-2level/auto/DBD/mysql/mysql.bundle

原因:在 /System/Library/Perl/5.10.0/darwin-thread-multi-2level/DynaLoader.pm 第 207 行找不到图像。

在(评估 7)第 3 行

在 (eval 7) 第 3 行的 require 中编译失败。

也许所需的共享库或 dll 未安装在预期的位置

我已经确定我从 CPAN 安装了 MySQL 所需的 DBD,所以我认为这不是问题所在。任何人都可以对这个问题有所了解吗?

0 投票
2 回答
740 浏览

c++ - 如何找到库以使用 dlopen 动态加载它们

在我正在进行的项目中,我们提供了动态加载附加功能的可能性。为此,我们使用 dlopen。

为了找到这个库,我们有一些我们称之为模块路径的东西。我们有一个默认路径,共享库所在的位置(其中很多已发货)。

目前我们有两个默认路径:我们首先在构建目录中查找共享库,然后在安装目录中查找。这是因为它也应该可以在不安装的情况下运行应用程序(因此在这种情况下,它需要首先在构建目录中查找)。

现在问题来了,如果用户从源代码构建应用程序并使用 make install 安装它,则默认情况下会加载她构建目录中的库。这将导致崩溃。因此,它仅在用户随后删除或重命名构建目录时才有效。

没有问题:是否有技巧(通过 C++ 或构建系统)知道应用程序是否已安装。问题是,该功能是在共享库中实现的,搜索模块的实现方式也必须适用于链接到我们库的其他应用程序(因此我们不能依赖可执行文件的路径)。我们使用 CMake 作为构建系统。

为了使情况更加困难,该解决方案必须在 Windows、Linux 和 Mac OS X 上运行。

编辑:

我进一步调查,问题更复杂。这是这种情况:

  • 有一个小的可执行文件
  • 此外,还有一个“主”库 main.so
  • 然后有一个动态加载的库 lib.so
  • lib.so 链接到 main.so

问题是,lib.so 在其 rpath 的构建目录中具有 main.so 的绝对路径。感谢@MSalters 的提示,我现在能够进行破解以确保加载正确版本的 lib.so(安装目录中的那个),但是由于它在 rpath 中有构建路径,因此它加载了错误的 main .so (所以实际上内存中有两个 main.so 副本——这把事情搞砸了)。

有没有办法从库中删除对构建路径的引用?我尝试了与 rpath 相关的所有 cmake 选项但没有成功