2011-09-24 20 views
6

Muszę odwołać się do biblioteki DLL, która jest dostępna w 2 wersjach (jedna dla 32-bitowej i jedna dla 64-bitowej). Moim celem jest zbudowanie aplikacji internetowej działającej na systemach 32- i 64-bitowych.Używanie dll 32-bitowych lub 64-bitowych w zależności od procesu bitness

Myślałem o przedstawieniu zespołu 32bit domyślnie za pomocą zdarzenia AssemblyResolve załadować wersję 64bit (jeśli załadowaniu wersji 32-bitowej nie powiodło się):

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); 
} 

Ale nawet gdy wystąpi BadImageFormatException, przewodnik _AssemblyResolve będzie nie daj się wezwać. Czy istnieje inny sposób osiągnięcia proponowanego zachowania?

Odpowiedz

0

Zobacz answers for dealing with this for System.Data.SQLite.

Myślę, że proponowana metoda powinna działać, ale musisz przenieść wersję 32-bitową, aby domyślnie nie można było znaleźć, więc _AssemblyResolve jest zawsze wywoływana dla tej biblioteki DLL. To tylko domysły.

+0

Wygląda na to, że nie ma lepszego sposobu. Dzięki i tak. – ollifant

1

Najprostszym sposobem, ale mniej elastyczny z mojego punktu widzenia jest wyraźnie określa konkretne platformy odniesienia w pliku csproj użyciu Condition:

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

Również można zrobić to dynamicznie przy użyciu Assembly.Load(AssemblyName) metoda przeciążenie. Parametr jest typu AssemblyName co naraża właściwość AssemblyName.ProcessorArchitecture które mogą być ustawione na None, MSIL, X86, X64, IA64, AMD64

Jedną rzeczą, którą również może wyglądać na to Publisher Policy File funkcji i poleceń argument wiersza /platform:processorArchitecture

+0

Użycie warunku w pliku projektu powoduje rozróżnienie w czasie kompilacji. W związku z tym nadal musiałaby redystrybuować dwie różne wersje. – ollifant

+0

Rozwiązanie Assembly.Load zadziała, ale wymagałoby to dużej ilości refleksji. A może dynamika też byłaby w porządku .. – ollifant

+0

@ollifant: .NET Framework obsługuje dwa sposoby rozwiązywania problemów z połączeniem - poprzez odniesienie statyczne lub dynamiczne. Dynamiczne tworzenie odniesień - Assembly.Load()/etc, static - tworzenie odniesień do pliku projektu lub jako zależność innego odniesienia za pośrednictwem metadanych. Jedną rzeczą, którą można również sprawdzić w funkcji 'Publisher Policy File' i argumentie wiersza poleceń'/platforma: processorArchitecture' – sll