問題タブ [assemblyresolve]
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# - アセンブリ解決を再トリガーしますか?
特定の DLL の "Copy Local" を false に設定して、AssemblyResolve をトリガーしています。AssemblyResolve がトリガーされ、DLL の場所を選択できるようになります。
コードの後半で、新しい DLL の場所を指定できるように AssemblyResolve を再トリガーする必要がありますが、最初の AssemblyResolve の DLL が正常に読み込まれたため、新しい DLL を再読み込みできません。
現在の DLL をクリアして再ロードする方法はありますか? またはそのような何か???
ありがとう!
c# - CLR ロード イベントを常にインターセプトする方法 (ロードの試行が失敗した場合だけでなく)
AppDomain.AssemblyResolve イベントに登録することで、自動 CLR 検索が失敗したときにアセンブリを読み込もうとする試みを処理できることがわかっています。
私の現在のプロジェクトでは、このようなメカニズムを介してすべてのアセンブリの読み込みを処理すると便利です。それを行う方法はありますか?
(醜い) 回避策は、実行可能ファイルを別のディレクトリに移動し、AssemblyResolve デリゲートによってすべてが処理されるようにすることです。そこにもっとクリーンなソリューションがあることを願っています。
よろしく、 アンドレア
asp.net - ASP.NET がアセンブリ参照を異なる方法で解決するのはなぜですか?
私はいくつかのリードを得るために同様の問題を見つけるのに本当に苦労しましたが、私たちが抱えているケースについて誰も説明していないようです.
バックグラウンド
次の一般的な設計の製品があります。
【ローカルインストールフォルダ】
- 製品機能の大部分を実装する .NET アセンブリのセットが含まれています。
- 例:実装 1.dll、実装 2.dll
【GAC】
- ClientAPI.dll。エンド ユーザーの Visual Studio プロジェクトから参照されるクライアント アセンブリ。ローカル インストール フォルダー内の実装 dll への強力な参照があります。
ClientAPI.dll には、エンド ユーザー プロジェクトを呼び出す必要があるエントリポイントがあります。と呼びましょうInitialize()
。
最初に行うことは、イベントを使用して、Initialize
いわゆるアセンブリ解決ハンドラーを現在のドメインにインストールすることです。AssemblyResolve
このハンドラーは、.dll を使用して、実装 dll を見つけてクライアント プロセスにロードする方法を認識しますAssembly.Load()
。
コンソール アプリケーションを考えてみましょう。次のようになります。
これで、コンソール/Windows フォーム/WPF の世界ですべてがうまくいきました。アセンブリ解決ハンドラーが適切にインストールされて呼び出され、ClientAPI.dll が機能を要求すると、実装 DLL への参照を正常に解決できます。
問題文
そうは言っても、コンソールまたは WPF アプリケーションのみをサポートするつもりはないため、ASP.NET で同じ設計に依存していました。したがって、VS 2010 で新しい ASP.NET Web アプリケーション プロジェクトを作成すると、すべてが次のように簡単になると考えました。
ASP.NET ランタイム ユニバースに 20 ~ 30 時間滞在し、開発サーバーと IIS の両方で上記のことを試してみると、実際には期待どおりではないことがわかりました。
ASP.NET では、ClientAPI
クラスがどこかで参照されるとすぐに、他のアセンブリへのすべての参照が即座に解決されることがわかります。それだけではありません。結果はキャッシュされます (.NET 2.0 以降は設計によるものです)。これは、CLR を支援しようとする機会がまったくないことを意味します。
私たちが試して学んださまざまなことについて詳しく説明することなく、基本的に次の質問に行き着きます。
ASP.NET がこのような参照を解決するのはなぜですか? 他のタイプのアプリケーションが行う方法とは互換性がありません。さらに、外部タイプ/アセンブリへの参照が最初に必要になったときに解決されるように指定されている.NET / CLRランタイムのドキュメントに従っていません(つまり、コードで最初に使用されます)。
どんな種類の洞察/アイデアも高く評価されます!
.net - ResolveEventArgs.RequestingAssembly が Null です
リフレクションを介してアセンブリを動的にロードしようとしています。私はこのようなフォルダ構造を持っています:
リフレクションを使用してsomeExtentionをロードできます。実行中にsomeExtentionがitsDependencyを探すときに問題が発生します。ドット ネットは BIN フォルダーを検索します。そこにはありません。Appdomain の AssemblyResolve イベントが発生しています...
このイベントをトラップしています。ResolveEventArgs で、ロードする必要があるアセンブリの名前を取得します。問題は、RequestingAssembly を取得できないことです。ResolveEventArgs のそのプロパティは常に空です。独自のEXTNフォルダーを直接見ることができるように、要求しているアセンブリが必要です。それがなければ、すべての EXTN フォルダーを調べる必要があり、私の場合は非常に大きくなる可能性があります。
RequestingAssembly にはプロパティ Location があり、この msdn article によれば、物理ファイルへのパスが含まれています。この記事では、このプロパティが Nothing になる状況についても説明します。そこで説明されている Load-Context がわかりません。
どんな助けもかなりのものです...
c# - 依存関係に対してAssemblyResolveが起動されない
AssenblyResolveイベントにしばらく苦労しています。私はstackoverflowを検索し、他のグーグルを実行し、関連すると思われるすべてを試しました。これが私の問題に近いリンクです(私の意見では):
静的メソッドを持つBootstrapperクラスがあります(わかりやすくするために、スレッドセーフなコードを削除します:
mainメソッドと静的コンストラクターを持つ単純なクラスがあれば、コードを機能させることができました。静的コンストラクターは、単にBoostrapper.Initialize()メソッドを呼び出しています。その後、ライブラリを使用でき、期待どおりに機能していました。
私が抱えている問題は、依存関係の層が少なくとも1つあるかどうかです。基本的にコードは同じままですが、今回はライブラリのコードが別のライブラリ内にあります。
私が以前に述べたリンクの#2のように聞こえますが、私が見ているものを説明していますが、それは機能しません。AssemblyResoveコールバックのVisualStudioブレークポイントがヒットすることはありません。
何が起こっているのかについて何か考えはありますか?
フランシス
c# - assemblyresolveを使用してC#で欠落しているアセンブリを処理する
http://support.microsoft.com/kb/837908の方法3に従って、C#でアセンブリを動的にロードしています。ただし、コードが機能していません。コードの次のセクションでは、欠落しているアセンブリの名前がアプリケーションによって参照されているアセンブリの1つである場合にのみ、作成者は欠落しているアセンブリをロードします。
これをデバッグで実行すると、関数が呼び出されますが、欠落しているアセンブリは参照されているアセンブリのいずれにも含まれていないため、私の場合は設定されていません。なぜこれが起こっているのか、何か考えはありますか?そのDLLがC#なのかネイティブC++なのかわかりません。これは、C ++ dllをこの方法でロードできないためでしょうか?では、なぜこの関数が欠落しているC++アセンブリに対して呼び出されるのでしょうか。説明をいただければ幸いです。これがC#から参照されるC ++アセンブリで機能しない場合、代替手段は何ですか?
c# - .NET assemblyResolve イベント ハンドラを実行する バージョンの検証を実行する
いくつかの共有コンポーネントに依存するアプリケーションがいくつかあります。これらの共有アセンブリをアプリケーションのローカル ディレクトリの外にある共有ディレクトリに移動しています。私の目標は、共有アセンブリの新しいバージョンがリリースされるたびに、共有ディレクトリ内に新しいバージョンを配置するだけでよく、アプリケーションで何も変更する必要がないことです。assemblyResolve イベントはこれに対する良い解決策だと思います。ハンドラーの動作方法について具体的な質問があります。
このハンドラーをアタッチして、共有ディレクトリから欠落しているアセンブリを解決するとします。アセンブリ名だけを使用してディレクトリ内の対応する dll を検索し、Assembly.LoadFrom(dllpath) を使用してロードします。
私のアプリケーションはアセンブリを参照しています: name:A,version:1.0,publickey:... アセンブリは version:2.0 にアップグレードされます 新しいアセンブリを共有ディレクトリに配置します。
アプリケーションは新しいバージョンを適切に取得しますか? 新しいアセンブリが読み込まれ、ハンドラーから返された後、C# は一致を行いますか?
私のテストから、それはうまくいきます。.NET は、ハンドラーから返されたアセンブリを登録するときにバージョンを無視します。私が間違っていないこと、および警告がないことを確認したいだけです
ありがとう
c# - DLL 内の ResolveEventHandler (クラス ライブラリ)
C# には、アプリケーション ディレクトリ内にない場合に外部 dll をロードする ResolveEventHandler イベントがあります。
winform アプリケーションで使用するには、次のように Program.cs Main() 関数にイベントを登録します。
そして、イベントが発生するたびに呼び出される ResolveAssembly 関数があります。
問題は、このイベントをクラス ライブラリに追加/呼び出しするにはどうすればよいかということです。
外部 DLL への参照が 3 つあるクラス ライブラリ (DLL) があります。これらの dll をアプリケーション ディレクトリにコピーしたくないし、アプリケーションのサブディレクトリに配置したくありません。これらの DLL は、特定の外部フォルダーに保持する必要があります (したがって、イベントを使用します)。
問題は、DLL (クラス ライブラリ) のどこにこのイベント登録を配置するかわからないことです。