0

現在、ZIP ファイルの読み取りに DotNetZip を使用する .NET Compact Framework のプロジェクトに取り組んでいます。プロジェクトは 2 つの部分に分割されます。CF プロジェクトとデスクトップ プロジェクトの両方で使用できる、プラットフォームに依存しない 1 つのライブラリ。この共通ライブラリには、ZIP ファイルを抽出するためのコードが含まれています。問題は、DotNetZip ライブラリの 2 つの異なる DLL があることです。1 つは .NET CF 用で、もう 1 つは .NET Desktop Framework 用です。デスクトップ フレームワークでライブラリの CF バージョンを使用することはできません。またその逆もできませんが、同じインターフェイスを共有します。

Visual Studio でプロジェクトを編成して、共通の郵便番号を使用し、適切な DLL (郵便番号によって使用される) を動的にロードできるようにするにはどうすればよいですか? PC 上で CF アプリケーションを実行することもできるはずですが、実行時に DLL を選択する方法はありますか?

4

1 に答える 1

1

アップデート:

技術的にはサポートされていませんが、有効な解決策は 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 は彼のブログにまともな記事を書いています。

于 2010-07-01T10:29:36.557 に答える