Laden...

[erledigt] DLL direkt aus Ressource von App verweden

Erstellt von Ayke vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.472 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 15 Jahren
[erledigt] DLL direkt aus Ressource von App verweden

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.

3.511 Beiträge seit 2005
vor 15 Jahren

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)

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 15 Jahren

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.

3.511 Beiträge seit 2005
vor 15 Jahren

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)

915 Beiträge seit 2006
vor 15 Jahren

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(

915 Beiträge seit 2006
vor 15 Jahren

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(

915 Beiträge seit 2006
vor 15 Jahren

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(

664 Beiträge seit 2005
vor 15 Jahren

Ich möchte das machen, damit ich eine kompakte Anwendung habe.

ILMerge bietet dir die Möglichkeit die Assemblies in eine zusammenzufassen.

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 15 Jahren

Super, danke für eure Lösungen.