問題タブ [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に含まれていることを確認しようとしましたが、実際にはその方法がわかりません。

Firebugの出力

さらに、$('a')fromを実行javascript.jsすると、必要なiframe内のすべてのリンクではなく、トップフレーム内のすべてのリンクが返されます。

御時間ありがとうございます!


更新:ダウンロードできる分離されたテストケースをまとめました。コンソールを確認し、これがトップフレームであることに注意してください(変数_TOPで確認できます)。

0 投票する
1 に答える
892 参照

.net - 実行時にロードされたdllバージョンを管理する方法は?

少し背景:

たくさんのデータといくつかのマネージDLLを含むライブラリプロジェクトAがあります。このプロジェクトには(サイズが大きいため)独自のインストーラーがあり、個別にインストールできます。

次に、プロジェクトAもインストールされていることを検出したときに、追加機能を提供できる他のプロジェクトがいくつかあります。

セットアップ:プロジェクトAによって実装されるインターフェイスを含むInterface.dllを作成しました。他のすべてのプロジェクトにはこのDLLが含まれているため、実行時にプロジェクトAをロードして、特定のインターフェイスにキャストできます。

この問題はバージョン管理で発生します。インストールされたプロジェクトAが古いバージョンに依存しているときに、一部のプロジェクトに新しいバージョンのInterface.dllが含まれる場合があります。これが発生すると、キャストが機能しなくなります。

私はいくつかの可能性を検討しています:

  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()、 で API を作成します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().so未定義のシンボルについて不平を言うときBLAH_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 上の実行可能イメージがフラッシュ メモリ内の 2 つのアドレスのいずれかにある可能性があり、これが問題を引き起こします。イメージの開始アドレスは、静的リンケージ中ではなく、ロード時にのみ認識されます。よくわかりませんが、これは動的ローディングとは言えませんが、私はこれについての専門家ではないので、ここで誤解される可能性があります。OS も動的ローダーもない場合に、ロード時にのみベース アドレスを指定できるように、イメージをコンパイルしてリンクする方法はありますか?

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 でイメージが見つかりません。

(eval 7) 行 3

(eval 7) 行 3 でコンパイルが require で失敗しました。

必要な共有ライブラリまたは dll が予期した場所にインストールされていない可能性があります

MySQLに必要なDBDをCPANからインストールしたことを確認したので、それは問題ではないと思います。誰でもこの問題に光を当てることができますか?

0 投票する
2 に答える
740 参照

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のすべてのオプションを試しましたが成功しませんでした