我有一个C++应用程序.这支持用户的C++插件DLL的,它将动态加载这些DLL的,然后能够动态地创建和使用用户的类型.这些用户类型派生自主应用程序核心库中定义的基本类型和接口,因此我将用户的对象作为指向基类的指针,并调用用户的虚函数以使其发生魔力.
现在我想扩展插件DLL以允许托管DLL(我主要关心C#).我想在C#插件DLL中发生所有相同的魔术.
如何动态加载这些dll的,一些如何我想我目前使用Win32的调用LoadLibrary将会很乐意与托管DLL.我无法在编译/链接时访问这些库,它们来自用户.
在我加载了库之后,不幸的是我怀疑COM在我将来作为调用派生函数的方式.可能我可以使用我一直在阅读的CLI/C++包装器,但我在这里非常缺乏经验,并希望得到任何建议或相关文章的链接.
我有以下代码使用GHC API加载模块并获取表达式的类型:
typeObjects :: [String] -> [String] -> IO [Type]
typeObjects modules objects = do
defaultErrorHandler defaultDynFlags $ do
runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
targets <- mapM ((flip guessTarget) Nothing) modules
setTargets targets
result <- load LoadAllTargets
case result of
Failed -> error "Compilation failed"
Succeeded -> do
m <- mapM (((flip findModule) Nothing) . mkModuleName) modules
setContext m []
values <- mapM exprType objects
return values
Run Code Online (Sandbox Code Playgroud)
如果表达式没有进行类型检查,则整个程序崩溃:
TestDynamicLoad: panic! (the 'impossible' happened)
(GHC version …Run Code Online (Sandbox Code Playgroud) 我一直在玩插件包.我希望主机应用程序在沙盒环境中动态编译和加载Haskell源文件.编译工作正常.只要插件仅引用沙箱中可用的模块,加载就会失败.这是我为插件所获得的:
module Plugin (resource) where
import ServerAPI
import System.Plugins -- this module is only available in the sandbox
resource = Interface { action = timesTwo }
timesTwo :: Integer -> IO Integer
timesTwo n = return $ n * 2
Run Code Online (Sandbox Code Playgroud)
从宿主应用程序加载插件如下所示:
pkgConfDir = "/home/me/plugins/.cabal-sandbox/x86_64-osx-ghc-7.8.4-packages.conf.d
loadedOk <- pdynload "Plugin.o" ["."] [pkgConfDir] "ServerAPI.Interface" "resource"
Run Code Online (Sandbox Code Playgroud)
这就是我在沙盒中得到的:
> cabal sandbox hc-pkg list
…
/home/me/plugins/.cabal-sandbox/x86_64-osx-ghc-7.8.4-packages.conf.d
plugins-1.5.4.0
…
Run Code Online (Sandbox Code Playgroud)
这是我在运行主机应用程序时得到的:
Failed to load interface for ‘System.Plugins.Env’
no package matching ‘plugins-1.5.4.0’ was found
Run Code Online (Sandbox Code Playgroud)
如上所述,当我摆脱import System.Plugins …
我正在开发一个具有多个类似代码路径的项目,我想将它从主项目分离到插件中.该项目必须保持跨平台兼容,我所研究的所有动态库加载API都是特定于平台的.
创建动态库加载系统的最简单方法是什么,可以在多个操作系统上编译和运行而无需额外修改代码?理想情况下,我想编写一个插件,并使其适用于项目支持的所有操作系统.
谢谢.
如果我在 C++ 中使用动态加载打开一个库,我以后可以重新加载该库的更新版本吗?我会自己测试一下,但在我开始研究它作为我正在研究的事情的潜在解决方案之前,我很好奇它的可行性。
以防万一,我在 Linux 上运行。能够使其在其他操作系统上运行会很好,但这不是必需的。
在Java中,JVM(例如HotSpot)能够进行JIT编译,并且该技术用于通过将字节码编译为本机代码来加速执行.我的问题是,这在技术上是如何发生的?我的理解是,现代处理器将内存区域标记为只读部分,以及可执行部分以防止恶意代码执行.因此,JVM无法将新的"可执行代码"写入它可以访问的内存空间(即自修改代码).所以,我猜测JVM生成本机代码,将其写入文件然后使用操作系统服务将该本机代码动态加载到内存中,
我确实看到了这个答案:如何将JIT编译的代码注入内存并执行?,但我很困惑为什么操作系统会允许用户程序READ + EXECUTE内存区域.其他操作系统,即Linux等提供类似的东西,以便JIT工作吗?
有人可以帮助澄清我的理解吗?
我不知道这会被称为什么搜索,如果这是重复请链接我:)
是否可以在浏览器的JavaScript中加载外部文件(这一点很容易),但考虑到外部文件可能相当大(比如50MB)显示加载该文件的进度指示器?
即我,知道文件的服务器端大小,不知道gzip大小,我想说X%的文件加载.
我没有尝试任何东西,我找不到任何可行的工作,更不用说找到可能的东西了.
问题:尝试按需加载50MB JavaScript库,但显示加载进度.
如果我的可执行文件调用dlopen加载库但忽略调用dlclose,则库将保持加载状态,直到进程退出并且操作系统强制它卸载.
如果我加载a.so它会加载b.so,然后调用dlclose上a.so,并在OS卸载b.so呢?
这与使用Microsoft等效的类似场景相比如何LoadLibraryEx?
我正在使用 firebase 主题订阅在我的 Electron 应用程序中推送通知。截至目前,我正在我的应用程序中对所有配置属性(如授权密钥、主题、senderId 等)进行硬编码。有什么方法可以根据环境访问这些参数吗?
简而言之,有没有办法在打包应用程序后动态加载配置属性,而不是硬编码配置属性?
environment-variables dynamic-loading electron firebase-cloud-messaging
dynamic-loading ×10
c++ ×4
c# ×2
dlopen ×2
haskell ×2
.net ×1
dll ×1
electron ×1
ghc-api ×1
interop ×1
java ×1
javascript ×1
jit ×1
linux ×1
native ×1
plugins ×1
portability ×1
progress-bar ×1
typechecking ×1