| 

.NET C# Java Javascript Exception

1
Hallo,

ich plane, für mich ein kleines Programm zu schreiben, das SQLite benutzen soll. Nun gibt es ja die DLLs in 32 und 64 Bit. Wenn ich das Projekt für "AnyCPU" erstelle, muss ich ja zur Laufzeit entscheiden, ob ich die beiden DLLs als 32- oder 64-Bit Version nutzen möchte. Wie bekomme ich das hin?
25.11.2013
muffi 1,4k 1 9
2 Antworten
0
Installiere beide DLL's in den GAC (Global Assembly Cache). Dazu musst du jeweils für die x86 und x64-Version der DLL folgenden befehl ausführen:

gacutil -i SQLite.Interop.dll

oder nutze die System.Data.SQLite.dll von http://system.data.sqlite.org welche für AnyCPU kompiliert ist.
28.11.2013
Floyd 14,6k 3 9
Ich habe keinen SQLite-Treiber gefunden, der für AnyCPU kompiliert ist (sonst hätte ich die Frage ja nicht gestellt ;-) ).
Warum ich das machen möchte? Ich möchte das Programm portabel halten, sprich, nur die .exe und die 4 DLLs kopieren. Ich muss mich wohl doch für 32 oder 64 Bit entscheiden.
muffi 28.11.2013
0
Du kannst selber zur Laufzeit die Assemblys laden in dem du einen AssemblyResolver Implementierst. Die AppDomain bietet dafür ein passendes Delegate an auf welches du dich so für wie möglich einhängen musst (also am besten im Main).

MSDN: AppDomain.AssemblyResolve-Ereignis.

Durch Behandlung dieses Ereignisses kann Ihre Anwendung eine Assembly von Speicherorten außerhalb der normalen Prüfpfade in den Load-Kontext laden, die zu ladenden Assemblyversionen auswählen, eine dynamische Assembly ausgeben und zurückgeben usw.


public class AssemblyResolver
{
public static void HandleUnresovledAssemblies()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += currentDomain_AssemblyResolve;
}

private static Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == "System.Data.SQLite")
{
var path = Path.Combine(pathToWhereYourNativeFolderLives, "Native");

if (IntPtr.Size == 8) // or for .NET4 use Environment.Is64BitProcess
{
path = Path.Combine(path, "64");
}
else
{
path = Path.Combine(path, "32");
}

path = Path.Combine(path, "System.Data.SQLite.DLL");

Assembly assembly = Assembly.LoadFrom(path);
return assembly;
}

return null;
}
}
http://stackoverflow.com/a/9723587/244010
28.11.2013
Floyd 14,6k 3 9
Das klingt ziemlich gut. Habe es gerade mal durch den Converter nach VB gejagt und mit einer leeren Form getestet (wie auf SO beschrieben rufe ich die HandleUnresovledAssemblies als Erstes im Form1.Load auf), komischerweise springt er die currentDomain_AssemblyResolve aber erst an, wenn ich das Formular schließe. Liegt möglicherweise daran, dass eben noch überhaupt nichts im Code sonst steht.
muffi 28.11.2013
Besser wäre es die Funktion direkt in der Main-Methode auszuführen.
Floyd 28.11.2013

Stelle deine .net-Frage jetzt!