問題タブ [dynamic-assemblies]
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.
c# - 毎回または 1 回だけアセンブリをロードする
私は自分の仕事のために拡張可能なサービス アプリケーションを構築しています。それを「拡張」する方法は、DLL をロードし、その中でメソッドを実行することです。このように設計されているため、新しいジョブを実行するたびに再コンパイルして再デプロイする必要はありません。現在、サービスは を使用して DLL をロードしAssembly.LoadFrom()
、アセンブリをサービスに登録します。登録でFunc<object, bool>
は、新しいジョブのエントリ ポイントを指定する が渡されます。
私の質問は、次のような方法でタスクを実行する必要があるたびにインスタンスを作成した方がよいでしょうか?
Func<>
または、タイマーに基づいて呼び出されるクラスに保存する現在の方法で行う方がよいでしょうか?
c# - 動的アセンブリのビルドをテスト ドライブする方法
IBM Db2 データベース用の LINQPad 用の動的コンテキスト ドライバーの構築に取り組んでいます。私はコードの大部分をテストしてきましたが、必要なデータベースについて必要なすべての情報を取得するのはほぼ完了したと思います。(後でもっと必要になるかもしれませんが、今のところは十分です)。PostgreSQL コンテキスト ドライバーの git リポジトリをダウンロードし、それがどのように構築されているかを (ある程度) 確認しました。アセンブリを構築していることを確信するには、十分なテストがありません。しかし、この動的アセンブリの構築を開始する場合、これをテストする方法がわかりません。次のように簡単に始めたかったのです。
これは正しいアプローチですか?これは私がそれを行う方法ですか?
c# - C#動的アセンブリは、新しいオブジェクトを作成してフィールドにロードできません
特定のタイプの新しいオブジェクトを作成してフィールドにロードしようとしていますが、
無効なプログラム例外。
ローカルを使用して同じことを行うとうまくいきます。多分フィールドで何か間違ったことをしていますか?これは動作しません:
しかし、これは機能します:
では、違いは何ですか?なぜ最初に機能しないのですか? ありがとう。
c# - 動的アセンブリ読み込みを使用してライブラリ プロジェクトから開始された外部プログラムの Visual Studio コンソール出力
3 つのプロジェクトで構成される単純なテスト ソリューションを作成しました。
- 最初のプロジェクトは、メソッド void DoSomething() を持つインターフェイス ITest を含むクラス ライブラリです。
- 2 番目のプロジェクトは、ITest を実装するクラス Test を含むクラス ライブラリでもあり、DoSomething では Console.WriteLine を実行するだけです。
- 3 番目のプロジェクトは、動的アセンブリの読み込みを使用して ITest インターフェイスを介して Test クラスを読み込み、インスタンス化する Forms アプリケーションです。
ソースコードは次のとおりです。
Test クラスを含む LibraryProject でフォーム アプリケーション プロジェクトを参照し、Debug の下のプロジェクト プロパティで [Start external program] を選択して、ライブラリ デバッグ フォルダーからフォーム アプリケーションを開始します。
予想どおり、ライブラリ プロジェクトを実行できるようになりました。これにより、フォーム アプリケーションが出力フォルダー内から外部プログラムとして開始されます。そこで、フォームはライブラリ dll を見つけて dynamicall をロードし、Test クラスで DoSomething メソッドを実行します。
ただし、これは私の問題/私の質問です。Visual Studio でコンソール出力が得られません。ライブラリ プロジェクトを実行すると、フォーム アプリケーションを完全にデバッグできますが、コンソール出力は表示されません。フォーム アプリケーションの代わりにコンソール アプリケーションを使用すると、外部 cmd が開かれ、そこに出力が表示されますが、出力がフォームでも動作する必要があり、Visual Studio の出力ウィンドウにある必要があります。
出力が表示されない方法を知っていますか? 出力を取得する方法の 1 つは、Console.WriteLine の代わりに Trace.WriteLine を使用することですが、コンソールが機能しないのにトレースが機能する理由がわかりません。どんな助けでも大歓迎です。
c# - このコードで動的に生成されるアセンブリはどこですか?
Excel スプレッドシートを生成するためのハイブリッド Excel Interop/EPPlus アプリは、実行するたびに徐々に遅くなります。
この理由を突き止めるために、ANTS Memory Profiler をダウンロードしてアプリを実行しました。
ANTS MP は、「CLR に読み込まれたアセンブリ」の詳細で、2 つの動的に生成されたアセンブリがあることを示しています。1 つは "InitializeExcelObjects()" メソッドにあります。これは、Excel.Application と関連オブジェクトを作成するため、理にかなっています。しかし、(おそらく?) アセンブリをロードする 2 番目の方法は次のとおりです。
...そして、関係するのはこれです:
...これは異常なことは何もしません (範囲はコード内のいたるところに割り当てられているため、これが他のものとは異なり、アセンブリのスポーナーと見なされるのはなぜですか)?
範囲が割り当てられたのはこれが初めてだからですか? それが完了すると、一部のアセンブリが動的に読み込まれますか (一度だけ)?
問題のメソッドを呼び出すコードは次のとおりです。
これは予想されることですか (この時点でアセンブリが動的に読み込まれるため)、それとも、経験しているパフォーマンスが徐々に悪化していることと関係があるのでしょうか?
アップデート
Glenn Ferrie のコメントに基づいて、この方法は興味深いかもしれません。
c# - 参照されたアセンブリを使用して実行時にコンパイルする
C# コードをメモリ内の文字列にコンパイルし、実行時に使用する関数を作成しました。それは非常にうまく機能します。
次に、小さなクラス ライブラリ (mynew.dll と呼びましょう) を作成し、c:\mylibraries\mynew.dll に配置しました。
私のコードでは、参照されたアセンブリを追加できます。私はこのようにします:
さて、私の C# コード文字列 (mycode) には、「Execute」という関数があります。この関数で mynew.dll から名前空間とクラスを宣言すると、次のエラーが発生します。
ファイルまたはアセンブリ 'MyNew、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
メイン アプリケーションの bin/debug フォルダーに dll をコピーすると、突然動作しますが、これは望ましくありません。メインアプリケーションではなく、実行時にコンパイルされるコードを使用したい。
ここに投稿する前にこれを行いました:
- 検索 Stackoverflow
- 中古グーグル
- dll をメモリではなくディスクにコンパイルしようとしました。これは機能します...問題は、dllがIISでロックされており、IISサーバーを再起動しないと削除できないことです。コードはいつでも変更される可能性があり、人々がウェブサイトにいるときにサーバーを再起動したくないため、オプションはありません。
これを修正する方法はありますか?
c# - 実行時に C# で動的型を作成する
実行時に ac# クラスを動的に作成しようとしています。
しかし、私はこれを具体的に行うことができません。
クラスのプロパティmin
またはmax
プロパティのgetメソッドが必要です。ProcessData
上記のタスクの私のコード:
c# - IL Emit で動的に生成されたクラスでローカル オブジェクトを使用する方法
これが可能かどうかさえわかりません..メソッドでは、動的アセンブリを作成し、型を定義し、その型のコンストラクターの IL を発行しています。このメソッドはIEnumerable<Action>
パラメータとして を取り、生成しているクラス内でその参照を使用できるようにしたいと考えています。
FluentMigrator または MigratorDotNet のいずれかで動作するデータベース移行ヘルパーを作成しました。正しい機能を検証するために単体テストを実装しようとしています。FluentMigrator を使用すると、ランナーをインスタンス化し、Migration クラスのインスタンスを渡すことができます。ただし、MigratorDotNet では、Migration クラスをインスタンス化して実行するためにスキャンするアセンブリを渡す必要があるため、動的な生成が行われます。
これは、動的にサブクラス化する基本クラスです。
これは動的実装を生成する私のコードです:
プロジェクトを開き、検査するサンプル サブクラスをいくつか作成しました。
または:
これは、生成される IL です。
または:
これを私が達成しようとしているものに適応させる方法がわかりません..ILロード命令で動的アセンブリのコンテキスト外に存在するこのローカルオブジェクトへの参照を作成できますか? 式は役に立ちますか? おそらく、コンストラクターでそれを渡そうとするのは間違った方法です-おそらく、代わりにアップとダウンの実装をオーバーライドします(への参照を渡すのではなく、アクションへの関数ハンドルのようにして、それへの呼び出しを発行できますかIEnumerable?)。
私はアセンブリと IL にある程度精通しており、操作を確認した後、自分がしようとしていることを実行できない可能性があると考え始めています。
それで、これは可能ですか? もしそうなら、誰かが私を正しい方向に向けることができますか?
好奇心旺盛な方のために、完全なコードはこちらにあります。