プラグイン用のPIPインストーラーを構築しています。プラグインは、1つのDLL内の1つのモジュールで構成されており、それを呼び出すことができますMyCoolPlugin.dll
(実際、このDLLは複数のマージされたDLLで構成されています)。さらに、プラグインにはサードパーティのDLLへの依存関係がいくつかあります(例Infragistics2.Win.UltraWinChart.v10.3.dll
)。
プラグインは正常にインストールされますが、プラグインに埋め込まれているプロセスには、UltraWinChartに応じたUIがあります。このプロセスのGUIを作成すると、Infragistics2.Win.UltraWinChart.v10.3.dll
このファイルがと同じディレクトリにある場合でも、プラグインはロードできないという例外をスローしますMyCoolPlugin.dll
。「このプロセスには定義された説明またはユーザーインターフェイスがありません」-ダイアログが表示されます。
プラグインで定義されInfragistics2.Win.UltraWinChart.v10.3.dll
ているディレクトリにコピーすると、正常に動作します。見た目は正しいですが、依存関係への参照はありません。マニフェストには、プラグインディレクトリ内のファイルごとに1つのエントリが含まれています。probingPath
petrel.exe.config
plugin.xml
<File>
Infragistics2.Win.UltraWinChart.v10.3.dll
依存関係が正しく読み込まれないのはなぜですか?
編集:
私は私たちが見ている問題の回避策を考え出しました。プラグインの初期化(Initialize()
関数)で依存関係を(ファイル名で)手動でプリロードすることにより、すべての依存関係がプリロードされていることを確認できます。ただし、このソリューションが安定しているかどうかはわかりません(起動時にクラッシュすることがあります)。私が使用しているコードは次のとおりです。
Assembly me = Assembly.GetExecutingAssembly();
FileInfo file = new FileInfo(me.Location);
foreach (FileInfo assembly in file.Directory.GetFiles("*.dll"))
{
try
{
Assembly.LoadFile(assembly.FullName);
}
catch (Exception e)
{
CoreLogger.Error(string.Format("Failed to load assembly {0}.", assembly.FullName), e);
}
}
プラグイン.NETアセンブリの依存関係(モジュールの依存関係ではなく、外部の依存関係)が確実に読み込まれるようにする方法についての詳細はありますか?AppDomain.CurrentDomain.AssemblyResolve
-eventを使用してロード障害をインターセプトしていますか?この回答は、他のすべてが失敗したときに、このイベントを使用して、実行中のアセンブリと同じフォルダーからアセンブリをロードする方法を示しています。正しいアプローチは、代わりに呼び出し元のアセンブリを使用することだと思います(実行中のアセンブリは、おそらくイベントハンドラーが定義されているアセンブリになるため)。この回避策のテストはまだ成功していません。
これがインフラジスティックスの問題ではないことを確認するために、他のアセンブリでテストしたことに注意してください。
編集2: 前に述べたように、プラグインDLLは、いくつかのアセンブリで構成されるマージされたDLLです。私はこのアプローチを使用して直接の依存関係を判断しましたが、Infragisticsはその1つではないようです。これは関連性がありますか?