6

2つのバージョン(1つは32ビット用、もう1つは64ビット用)で利用可能なDLLを参照する必要があります。私の目標は、32ビットシステムと64ビットシステムの両方で動作するWebアプリケーションを構築することです。

デフォルトで32ビットアセンブリを参照し、AssemblyResolveイベントを使用して64ビットバージョンをロードすることを考えました(32ビットバージョンのロードに失敗した場合)。

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += _AssemblyResolve;
    // Try LoadAssembly ...
}

static System.Reflection.Assembly _AssemblyResolve(object sender, ResolveEventArgs args)
{
    var path = string.Format(@"...\lib_x64\{0}.dll", args.Name);
    return Assembly.LoadFrom(path);
}

ただし、BadImageFormatExceptionが発生した場合でも、_AssemblyResolveハンドラーは呼び出されません。提案された動作を実現する他の方法はありますか?

4

2 に答える 2

1

最も簡単な方法ですが、私の観点からは柔軟性が低く、以下を使用してcsprojファイルでプラットフォーム固有の参照を明示的に指定しますCondition

<ItemGroup Condition=" '$(Platform)' == 'x86' ">
    <Reference Include="MyAssemblyx86">

また、 Assembly.Load(AssemblyName)メソッドのオーバーロードを使用して動的に実行できます。パラメータは、プロパティAssemblyName.ProcessorArchitectureを公開するタイプAssemblyNameであり、None、MSIL、X86、X64、IA64、AMD64に設定できます。

また、調べることができる1つのことは、Publisher Policy File機能とコマンドライン引数です。/platform:processorArchitecture

于 2011-09-24T11:53:28.023 に答える
0

System.Data.SQLiteについては、これに対処するための回答を参照してください。

提案された方法は機能するはずですが、デフォルトで見つからないように32ビットバージョンを移動する必要があるため、_AssemblyResolve常にそのdllに対して呼び出されます。それは単なる推測です。

于 2013-01-04T14:17:09.250 に答える