問題タブ [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.
javascript - iframeに含まれるJSには、トップフレームウィンドウのコンテキストがあります
間違っている場合は訂正してください。ただし、JSをiframeにロードする必要があると思います。に追加してみましたhead
。
問題
javascript.js
は実行されますがconsole.debug(this)
、そのスクリプトではトップフレームウィンドウが返されます。スクリプトが実際にiframeに含まれていることを確認しようとしましたが、実際にはその方法がわかりません。
さらに、$('a')
fromを実行javascript.js
すると、必要なiframe内のすべてのリンクではなく、トップフレーム内のすべてのリンクが返されます。
御時間ありがとうございます!
更新:ダウンロードできる分離されたテストケースをまとめました。コンソールを確認し、これがトップフレームであることに注意してください(変数_TOPで確認できます)。
.net - 実行時にロードされたdllバージョンを管理する方法は?
少し背景:
たくさんのデータといくつかのマネージDLLを含むライブラリプロジェクトAがあります。このプロジェクトには(サイズが大きいため)独自のインストーラーがあり、個別にインストールできます。
次に、プロジェクトAもインストールされていることを検出したときに、追加機能を提供できる他のプロジェクトがいくつかあります。
セットアップ:プロジェクトAによって実装されるインターフェイスを含むInterface.dllを作成しました。他のすべてのプロジェクトにはこのDLLが含まれているため、実行時にプロジェクトAをロードして、特定のインターフェイスにキャストできます。
この問題はバージョン管理で発生します。インストールされたプロジェクトAが古いバージョンに依存しているときに、一部のプロジェクトに新しいバージョンのInterface.dllが含まれる場合があります。これが発生すると、キャストが機能しなくなります。
私はいくつかの可能性を検討しています:
- interface.dllを破棄し、すべてを動的にロードします。
- いくつかのバージョン検出と、プロジェクトAのバージョンを更新するようにユーザーに通知します。
- 他の通信手段(コマンドラインなど)を使用する
c# - プラグインアーキテクチャの実装-ダイナミックDLLのロード
私は基本的に、コントロールを使用してページをデザインできるプリロードされたコントロールを備えたデザイナーであるアプリケーションを持っています。
今後、さらに多くのコントロールをリリースする予定です。新しく追加されたコントロールの新しいビルドには欠点があるため、リリースしたくありません。だから私はアドオン/プラグインのようなアーキテクチャを考えていました。アドオン/プラグインを個別にリリースするだけで、デザイナー内にインストールしてコントロールを取得できます。
現在、コントロール、動作、スタイルなどを指定するためのアドオンとしてxmlファイルを使用しています。各xml(アドオン)は単一のコントロールを表します。しかし、すべてのプラグインを読み取るための汎用パーサーを作成する必要があるため、これを実装するのは非常に難しいと感じています。
代わりに、アドオンごとにdllをリリースして、コントロールの動作/外観を定義し、メインエンジンを介して動的にロードするコードを記述するためのより多くのコントロールを提供できますか?もしそうなら、どうすればdllをチェックしてアプリケーションに動的にロードできますか?
linux - dlopen() .so が削除された実行可能ファイルでシンボルを見つけられない
Linuxに実行可能ファイルがあります-exe
この実行可能ファイルには、コード全体で使用されるいくつかの関数が含まれています。
sendMsg
debugPrint
.so
次に、実行可能ファイルに追加機能を提供するを動的にロードしたいと考えています。
この共有ライブラリには、 と のヘッダーが含まれsendMsg
ていdebugPrint
ます。
この共有ライブラリを で読み込みdlopen()
、 で API を作成しますdlsym()
。
ただし、読み込み時にすべてのシンボルを解決するためdlopen()
に使用します。RTLD_NOW
sendMsg
シンボルが見つからないと言って失敗します。
sendMsg.c
がコンパイルされているため、このシンボルは実行可能ファイルに含まれている必要があります。
ただし、実行可能ファイルはmake
プロセスによって削除されます。そのdlopen
ため、シンボルを見つけることができないのは理にかなっています。
どうすればこの状況を解決できますか?
- 共有関数を静的ライブラリに構築し、その静的ライブラリを
exe
と の両方にリンクできます.so
。これにより、コードサイズが増加します:( - のストリッピングを削除し
exe
て、シンボルを見つけることができます - 私が知らないコンパイル時のリンクマジックを実行して
.so
、シンボルがどこにあるかを知っていますexe
dynamic-linking - 動的読み込み: 共有静的ライブラリ内の未定義のシンボル
.so
プラグインをロードする実行可能ファイルがあります。
-rdynamic
シンボル コールバックが発生するように、実行可能ファイルがリンクされます。
実行可能ファイルに含まれている静的ライブラリがあります。これにはBLAH_hello()
、.a
スタティック ライブラリは実行可能ファイルでは使用されません。BLAH_hello()
つまり、実行コード内にへの呼び出しはありません。
ただし、 に.so
は への呼び出しがありますBLAH_hello()
。
私dlopen()
が.so
未定義のシンボルについて不平を言うときBLAH_hello()
BLAH_hello()
のように、実行可能コードにダミーの呼び出しを含めると、BLAH_hello(NULL);
. シンボルは実行可能ファイルに含まれており、.so
ロード時にシンボルが検出されます。
をリンクすることもできると確信.so
して.a
いますが、動的にロードされた複数の が呼び出しを.so
使用するBLAH_hello
ため、実行可能ファイルに含めることは理にかなっています。ライブラリをそれぞれにリンクすると、シンボルの競合も心配です.so
。
だから私が疑問に思っているのは、実行可能ファイルで実際に使用さ.a
れていなくても、実行可能ファイルにシンボルを取得する方法ですか?
c# - C ++ DLLからC#dllを動的にロードする方法
私はC++アプリケーションを持っています。これは、ユーザーのC ++プラグインDLLをサポートし、これらのDLLを動的にロードしてから、ユーザーのタイプを動的に作成して使用できるようにします。これらのユーザータイプは、メインアプリケーションのコアライブラリで定義されている基本タイプとインターフェイスから派生しているため、ユーザーのオブジェクトを基本クラスへのポインターとして保持し、ユーザーの仮想関数を呼び出して魔法を実行します。
ここで、プラグインDLLを拡張して、マネージDLLを許可したいと思います(私は主にC#に関心があります)。同じ魔法をすべてC#プラグインDLLで発生させたいです。
これらのdllを動的にロードするにはどうすればよいですか。現在使用しているwin32のLoadLibraryは、マネージドDLLに満足するだろうと思います。コンパイル/リンク時にこれらのライブラリにアクセスすることはできません。これらはユーザーからのものです。
ライブラリをロードした後、残念ながら、派生関数を呼び出す方法として、将来的にCOMが疑われます。おそらく、私が読んでいるCLI / C ++ラッパーを使用することができますが、ここでは非常に経験が浅いので、適切な記事へのアドバイスやリンクをいただければ幸いです。
c# - いくつかのdllファイルからUIViewを動的にロードする
プロジェクトにナビゲーションコントローラーがあります。次に、さまざまなdllファイルからビューをロードし、それらをナビゲーションコントローラーに追加します。それが可能かどうかはわかりません。可能であれば、どうすればこれを行うことができますか?ビューごとに個別のdllを作成するにはどうすればよいですか?
私はMonotouchとC#を使用していることに注意してください。
embedded - ロード タイム ベース アドレス cortex-m3 ベア メタル
ベアメタル環境のcortex-m3 CPUのプロジェクトに取り組んでいます。ソフトウェアのアップグレードが必要なため、CPU 上の実行可能イメージがフラッシュ メモリ内の 2 つのアドレスのいずれかにある可能性があり、これが問題を引き起こします。イメージの開始アドレスは、静的リンケージ中ではなく、ロード時にのみ認識されます。よくわかりませんが、これは動的ローディングとは言えませんが、私はこれについての専門家ではないので、ここで誤解される可能性があります。OS も動的ローダーもない場合に、ロード時にのみベース アドレスを指定できるように、イメージをコンパイルしてリンクする方法はありますか?
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 でイメージが見つかりません。
(eval 7) 行 3
(eval 7) 行 3 でコンパイルが require で失敗しました。
必要な共有ライブラリまたは dll が予期した場所にインストールされていない可能性があります
MySQLに必要なDBDをCPANからインストールしたことを確認したので、それは問題ではないと思います。誰でもこの問題に光を当てることができますか?
c++ - dlopen を使用して動的にロードするライブラリを見つけるにはどうすればよいですか
私が取り組んでいるプロジェクトでは、追加機能を動的にロードする機能を提供しています。そのために、dlopen を使用します。
このライブラリを見つけるために、モジュール パスと呼ばれるものがあります。そこには、共有ライブラリがあるデフォルトのパスがあります (それらの多くは出荷されています)。
現時点では、2 つのデフォルト パスがあります。最初に共有ライブラリのビルド ディレクトリを検索し、その後でインストール ディレクトリを検索します。これは、アプリケーションをインストールせずにアプリケーションを実行することも可能である必要があるためです (その場合、ビルド ディレクトリを最初に検索する必要があります)。
問題は、ユーザーがアプリケーションをソースからビルドして make install でインストールすると、ビルド ディレクトリのライブラリがデフォルトで読み込まれることです。これにより、クラッシュが発生します。そのため、後でユーザーがビルド ディレクトリを削除または名前変更した場合にのみ機能します。
質問はありません: アプリケーションがインストールされているかどうかを知るための (C++ またはビルド システムによる) トリックはありますか。問題は、機能が共有ライブラリに実装されており、モジュールを検索するために実装された方法が、ライブラリにリンクする他のアプリケーションでも機能する必要があることです (したがって、実行可能ファイルのパスに依存することはできません)。ビルドシステムとして CMake を使用しています。
状況をさらに困難にするために、このソリューションは Windows、Linux、および Mac OS X で動作する必要があります。
編集:
さらに調査したところ、問題はより複雑になりました。これは状況です:
- 小さな実行可能ファイルがあります
- さらに、「メイン」ライブラリ main.so があります。
- 次に、動的にロードされたライブラリ lib.so があります
- main.so に対する lib.so リンク
問題は、lib.so の rpath にビルド ディレクトリの main.so への絶対パスがあることです。@MSalters のヒントのおかげで、正しいバージョンの lib.so (インストール ディレクトリにあるもの) を確実にロードするようにハックすることができましたが、rpath にビルド パスがあるため、間違ったメインをロードします。 .so (つまり、実際には、メモリ内に main.so の 2 つのコピーがあります。これは混乱を招きます)。
ライブラリからビルド パスへのこの参照を削除する方法はありますか? rpathに関連するcmakeのすべてのオプションを試しましたが成功しませんでした