Hallo,
Ich möchte eine Application schreiben die alle Bibliotheken direkt in der Ressource hat. Also nicht extra eine Bibliotheken Datei in den Anwendungspfad erstellt.
Ich habe dazu meine Bibliotheken wie z.b ein Bild in den Ressource ordner abgelegt. Nun möchte ich darauf einen Verweis machen. Ich bin mir nicht sicher ob das so funktionieren kann. Muss ich die Bibliotheken in den Speicher schreiben und dan von dort darauf zugreifen. Und wenn ja wie soll ich darauf zugreifen ? Ich kann ja keine Speicheradresse als Parameter bei DllImport angeben.
Brauche ein Lösung für eine .Net Bibliothek und eine unmanged Bibliothek.
Ich hoffe ihr könnt mir helfen.
Ich glaube da müssen wir mal ein Schritt zurück. Warum willst du das so machen?
Wenn eine der Assemblies auf eine andere verweist, muss diese im Ausführungsordner oder im GAC liegen. Sonst knallt es schon sofort beim Start der Anwendung.
Bei unmanaged DLLs könnte man es via Win32 über LoadLibrary machen.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Ich möchte das machen, damit ich eine kompakte Anwendung habe.
Ich habe LoadLibrary mal verwendet als ich eine dll injection gemacht habe. Jedoch denke ich das mir diese Funktion im .Net Framework nicht viel nutzen wird da meine Anwendung damit crashen wird. Ich muss irgenwie die DllImport Funktion nutzen, nur kann ich damit auf keine Speicherbereiche zeigen.
DllImport bietet das definitiv nicht. Da hast du nur die Möglichkeit über den Namen oder der Ordnungszahl.
Ich möchte das machen, damit ich eine kompakte Anwendung habe.
Ist es nicht vollkommen egal, ob da nun eine, oder 10 Dateien im Ordner rumfliegen? Oder geht es dir um die Verteilung der Anwendung? Da bringt das .NET Framework eigentlich alles mit (Setup Projekte, Click-Once).
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Hrm, es gibt wieder viele Wege das zu lösen 🙂
Hier der einfachste für .NET.
// myInjection.dll
//namespace myInjection
//{
// public static class MyTest
// {
// public static int Test()
// {
// return 1;
// }
// }
//}
public void bla()
{
Assembly assembly = Assembly.Load(Properties.Resources.myInjection);
MethodInfo method = assembly.GetTypes()[0].GetMethod("Test"); // die methode
int ret = (int)method.Invoke(null, null);
}
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
Und hier der für unmanaged, wenn auch etwas komplexer:
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string csFileName);
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr IntPtr_Module, string csProcName);
[DllImport("kernel32.dll")]
static extern bool FreeLibrary(IntPtr IntPtr_Module);
private delegate int myFunctionDelegate();
private myFunctionDelegate Invoke = MyFunction();
public void bla()
{
// hier kannst dir ja noch was besseres einfallen lassen
using (MemoryStream ms = new MemoryStream(Properties.Resources.MyLib))
{
using (FileStream fs = File.Create(@"C:\MyLib.dll"))
{
fs.Write(ms.ToArray(), 0, (int)ms.Length);
fs.Flush();
}
}
int test = Invoke();
}
private static myFunctionDelegate MyFunction()
{
IntPtr hMod = LoadLibrary(@"C:\MyLib.dll");
IntPtr hFunction = GetProcAddress(hMod, "MyFunction");
///FreeLibrary(hMod); // kann sein dass das erst nach dem return passieren sollte
return Marshal.GetDelegateForFunctionPointer(hFunction, typeof(myFunctionDelegate)) as myFunctionDelegate;
}
Musst halt etwas dran rumpfeilen, konnte es nicht testen.
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
Ich hab mir Khalid's Vorschlag nochmal durch dne Kopf gehen lassen und eigentlich sollte das auch gehen. Zwar wäre das dann ein klassischer Trojaner bei dem Die Virenscanner zwar drauf anspringen sollten aber gehen würde es.
Man müsste das nur in Verbindung mit CreateRemoteThread angehen, wenn man davon ausgeht das ein zeiger nur eine variable ist so könnte man den assembler code überlisten. Indem man mit WriteProcessMemory eine struktur mit eben den aufrufen deiner Methoden via DLLImport in deinen Prozess reinschreibt.
Denke das geht sicherlich auch, bin mir nur nicht sicher ob das in C# wirklich abbildbar ist.
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
Ich möchte das machen, damit ich eine kompakte Anwendung habe.
ILMerge bietet dir die Möglichkeit die Assemblies in eine zusammenzufassen.