アップデート:
技術的にはサポートされていませんが、有効な解決策は p/Invoke LoadLibrary で、プロセスの早い段階で適切な DLL を明確にロードすることです。すべてのマネージド ライブラリと p/Invoke されたライブラリは、「必要に応じて」読み込まれます。そのアセンブリ内の型の 1 つに依存するメソッドを呼び出すと、CLR によってそれらが読み込まれます (注: これは「サポートされていない」部分です。これは文書化されておらず、将来の CLR バージョンで変更される可能性があります)。
このアプローチが機能するのは、アセンブリが を介して読み込まれる場合LoadLibrary
、CLR ローダーによって「検出」され、ランタイムが再度読み込みを試行しないためです。CF でこのトリックを使用して、メモリ不足の状況を回避するために、多くのメモリ割り当てを行う前にアセンブリをプリロードしました。
したがって、次のことができるはずです。
public static void Main()
{
LoadCorrectDLLs();
// .NET will ensure DotNetZip is loaded at this point.
MethodInThisAssembly();
}
public static void MethodInThisAssembly()
{
// Since MethodInThisAssembly uses DotNetZip,
// its assembly will get loaded immediately before this method is called.
IDotNetZipInterface x = null;
...
}
public static void LoadCorrectDLLs()
{
// p/Invoke LoadLibrary to load the correct version of DotNetZip.
}
以下は機能しないことに注意してください。
public static void Main()
{
LoadCorrectDLLs();
// This line would force DotNetZip to get loaded before Main() is called
IDotNetZipInterface x = null;
}
古い答え; デスクトップ フレームワークでのみ動作します。
1 つのトリックは、DLL の読み込み中に見つからないディレクトリ (実行可能ファイルのディレクトリの別のサブディレクトリなど) にそれらを配置し、AppDomain.AssemblyResoveを処理することです。David Morton は彼のブログにまともな記事を書いています。