Ładowanie zespołu x86 lub x64

Mam dwie wersje systemu.Data.SQLite.DLL - dla platformy x86 i x64. Wersja x86 jest przechowywana w folderze aplikacji, a wersja x64 w folderze appFolder\x64. Aplikacja skompilowana jako AnyCPU. Jak mogę załadować potrzebną wersję SQLite według platformy windows?

Author: tc., 2010-09-24

7 answers

Jeśli używasz SQLite z http://system.data.sqlite.org , System.Data.SQLite.DLL jest w pełni zarządzany. Istnieje macierzysta biblioteka DLL, SQLite.Interop.DLL, który musi się zmienić w zależności od procesu (32-lub 64-bit).

Wdrażam natywne biblioteki w ".\ Native\X64 " Dla 64-bitowych i ".\ Native\X86 " dla 32-bitów. W czasie wykonywania P / wywołaj SetDllDirectory, aby ustawić katalog ładowania DLL wskazujący na właściwą ścieżkę dla proces. http://msdn.microsoft.com/en-us/library/ms686203 (v=vs.85). aspx

(zauważ, że nie jestem zaznajomiony z architekturą starszego systemu.Data.SQLite.Wersja DLL z http://sqlite.phxsoftware.com )

private static class NativeMethods
{
    [DllImport("kernel32.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern bool SetDllDirectory(string pathName);
}

... 

    // Underlying SQLite libraries are native. 
    // Manually set the DLL load path depending on the process.
    var path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Native");
    if(IntPtr.Size == 8) // or: if(Environment.Is64BitProcess) // .NET 4.0
    {
        path = Path.Combine(path, "X64");
    }
    else
    {
        // X32
        path = Path.Combine(path, "X86");
    }
    NativeMethods.SetDllDirectory(path);
 16
Author: Jason Morse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-07 05:23:17

Niektóre programy antywirusowe zapobiegają SetDllDirectory () - długo mi to zajęło. Używamy

System.Reflection.Assembly myass = System.Reflection.Assembly.GetExecutingAssembly();
FileInfo fi = new FileInfo(myass.Location);
System.IntPtr moduleHandle = LoadLibraryEx(fi.Directory.FullName + "\\x64\\SQLite.Interop.DLL", IntPtr.Zero, 0);

Aby załadować bibliotekę DLL x64 jawną ścieżką. Jest on ładowany w tym momencie, A środowisko uruchomieniowe. NET użyje biblioteki DLL w pamięci zamiast szukać jej na dysku.

 12
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-14 08:52:53

Jest wbudowane wsparcie dla tego w wersji 1.0.80.0 i późniejszych.

Jeśli maszyny deweloperskie i klienckie mogą mieć różne architektury procesorów, może być wymagany więcej niż jeden pakiet binarny. W tej sytuacji zalecane jest użycie funkcji wstępnego ładowania biblioteki natywnej . Jest on dostępny od wersji 1.0.80.0 i domyślnie włączony. (ze strony pobierania)

Jednak, aby to działało we własnej wtyczce, musiałem również dodać to przed odwołaniem się do SQLite po raz pierwszy:

// Make SQLite work... (loading dll from e.g. x64/SQLite.Interop.dll)
System.Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory", System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));

Sql.Data.SQLite...

Zobacz to pytanie: New SQLite mixed assemblies

 5
Author: johv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:08:47

Dziwię się, że to w ogóle działa. Powinien najpierw znaleźć wersję x86 i zawieść. Nieudane Wiązanie assembly nie powoduje kolejnej próby poprzez AssemblyResolve.

Oczywiście, CLR nie może znaleźć wersji x86 lub to również zawiedzie w trybie x64. Innymi słowy, gdy naprawisz problem, złamiesz 64-bitowy kod. Najpierw pogódź się z problemem x86, użyj Fuslogvw.exe, aby zobaczyć, które foldery są badane dla złożenia.

Prawdziwa poprawka powinna zawierać przenoszenie montaż x86 w osobnym folderze i odpowiednie dostosowanie obsługi zdarzeń. Możesz przetestować IntPtr.Rozmiar, aby dowiedzieć się, czy pracujesz w trybie 64-bitowym(Rozmiar == 8). Pamiętaj również, aby wygenerować pełną nazwę ścieżki, użycie ścieżki względnej jak teraz może spowodować awarię, gdy katalog roboczy aplikacji nie jest ustawiony tam, gdzie masz nadzieję, że jest. Montaż.GetEntryAssembly().Lokalizacja daje Ci ścieżkę EXE.

 3
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-24 14:00:42

Możesz użyć Environment.Is64BitProcess aby zidentyfikować proces jako 64-bitowy. (Starałbym się unikać wyłapywania WYJĄTKÓW jako kontroli przepływu w miarę możliwości.)

 1
Author: Paul Ruane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-24 13:23:44

Nie mógłbyś po prostu użyć źródła SQLite jako oddzielnego projektu w swoim rozwiązaniu zamiast wstępnie skompilowanego zestawu? Używając AnyCPU sam system zajmie się wszystkim i nie musisz tego robić w kodzie...

 0
Author: timtos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-24 13:24:19
  1. zainstaluj odpowiednią bibliotekę DLL w GAC (np. wersja 64-bitowa na platformie 64-bitowej)
  2. Użyj wiązania do montażu w konfiguracji web / app (ewentualnie w konfiguracji maszyny)
  3. w pełni kwalifikują wszelkie odniesienia do montażu częściowego w konfiguracji web / app.
 0
Author: Ryan.Bartsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-28 01:21:45