Laden...
Avatar #avatar-3347.jpg
mogel myCSharp.de - Member
Wissenschaftler (wahnsinnig) Dabei seit 05.08.2010 156 Beiträge
Benutzerbeschreibung

Forenbeiträge von mogel Ingesamt 156 Beiträge

27.08.2010 - 23:16 Uhr

Evtl. mit WMI, s.
>

bzw.
>

mit WMI werde ich es dann am Montag versuchen - an nativ hatte ich auch schon gedacht

Ansonsten geht das auch recht einfach mit:

  
for(char c = 'A'; c <='Z'; c++)  
{  
  DriveInfo di = new DriveInfo(c.ToString());  
  bool istNetzwerk = (di.DriveType == DriveType.Network);  
}  
  

das klappt nicht ... hatte ich auch schon gemacht ... instanziere mal DriveInfo für ein Laufwerk was Du nicht hast (B:\ oder so) ... das ist dann das Gleiche wie bei mir für ein Netzlaufwerk ... sprich - für .NET existieren die Netzlaufwerke einfach nicht

Aber was meinst du genau mit "verloren"?

das ich die Dinger nicht über .NET finde 😃

27.08.2010 - 09:22 Uhr

Moin,

ich habe meine Netzlaufwerke verloren ... via DriveInfo.GetDrives() lasse ich mir alle Laufwerke liefern die im Rechner vorhanden sind ... funktioniert auch - nur eben nicht bei Netzlaufwerken ... die werden ignoriert ... selbst wenn ich das Netzlaufwerk direkt instanziere new DriveInfo("K:&quot;) funktioniert es nicht ... im Explorer ist das Laufwerk geöffnet und ich kann darauf zugreifen

wen im Framework muss ich bearbeiten das mir meine Netzlaufwerke (sind 3 Stück) angezeigt werden 🤔

hand, mogel

08.08.2010 - 00:13 Uhr

zahl = ROUND(zahl * 10hochKOMMASTELLEN) / (10hochKOMMASTELLEN)

07.08.2010 - 14:15 Uhr

Moin,

Calculon - All My Plugins

hand, mogel

05.08.2010 - 15:20 Uhr

super - funktioniert 🙂 ... sowas in der Richtung habe ich schon den ganzen Tag gesucht ... also das ich die entsprechende DLL vorgeben kann 8)


		private byte[] asmi;
		private byte[] asmp;

		public Program()
		{
			PrepareFile("interface.dll", "i.dll");
			PrepareFile("projekt.dll");

			try
			{
				AppDomain dom = AppDomain.CurrentDomain;

				dom.AssemblyResolve += new ResolveEventHandler(dom_AssemblyResolve);

				asmi = LoadAssembly("i.dll");
				asmp = LoadAssembly("projekt.dll");

				dom.Load(asmi);
				dom.Load(asmp);

				foreach (Assembly asm in dom.GetAssemblies())
				{
					Logging.info("loaded: " + asm.FullName);
					foreach (Type t in asm.GetTypes())
					{
						if (t.FullName.Equals("projekt.GUI"))
						{
							Logging.info("starte GUI");
							Assembly a = t.Assembly;
							Form f = a.CreateInstance("projekt.GUI", true) as Form;
							Application.Run(f);
						}
					}
				}
			} catch (Exception ex)
			{
				Logging.error(ex);
			}
		}


		Assembly dom_AssemblyResolve(object sender, ResolveEventArgs args)
		{
			String name = args.Name.Split(',')[0];
			if (name.Equals("interface")) return Assembly.Load(asmi);
			return null;
		}


		private void PrepareFile(String source, String destination)
		{
			if (File.Exists(source))
			{
				PrepareFile(source);
				File.Copy(source, destination, true);
				File.Delete(source);
			}
		}

danke, mogel

05.08.2010 - 13:44 Uhr

Moin,

ich experiementiere gerade mit dem manuellen Laden von Assemblies ... Sinn ist das verschlüsseln eben jener und dann das Laden und Interne entschlüsseln ... dazu habe ich 3 Librarys - "interface", "library" und "projekt" ... "projekt" enthält eine Form mit 2 Buttons ... "interface" stellt ein Interface zum Zugriff auf "library" von "projekt" aus ... "library" wird unter "projekt" ebenfalls dynamisch geladen" (als Plugin quasi)

dann habe ich ein Programm "Loader" - welches eben "projekt" und "interface" laden und entschlüsseln soll ... im Moment habe ich quasi das - was nur teilweise funktioniert


		public Loader()
		{
			PrepareFile("interface.dll");
			PrepareFile("projekt.dll");

			try
			{
				AppDomain dom = AppDomain.CurrentDomain; 
				dom.Load(LoadAssembly("interface.dll"));
				dom.Load(LoadAssembly("projekt.dll"));

				foreach (Assembly asm in dom.GetAssemblies())
				{
					Logging.info("loaded: " + asm.FullName);
					foreach (Type t in asm.GetTypes())
					{
						if (t.FullName.Equals("projekt.GUI"))
						{
							// PrepareFile("interface.dll");
							Assembly a = t.Assembly;
							Form f = a.CreateInstance("projekt.GUI", true) as Form;
							Application.Run(f);
						}
					}
				}
			} catch (Exception ex)
			{
				Logging.error(ex);
			}
		}

PrepareFile verschlüsselt (bzw. entschlüsselt) mit simplen XOR (0xff) ... die Dateien werden testweise am Anfang verschlüsselt da sie ja bei jedem Build neu erstellt werden ... LoadAssembly lädt die Assembly und entschlüsselt sie entsprechend

das Einlesen der Assemblies "interface" und "projekt" funktioniert wie erwartet ... "projekt" referenziert die bereits geladen "interface" in der AppDomain ... denn wenn ich die beiden Zeilen tauschen, dann knallt es - da "projekt" in der AppDomain "interface" nicht findet und .NET versucht dann eben die verschlüsselte von Pladde zu laden

das Problem ist das Erzeugen des Objektes "projekt.GUI" ... hier wird immer die "interface" von der Platte direkt geladen - welche ja verschlüsselt ist ... wenn ich den Kommentar bei PrepareFile vor der Instanzierung wegnehme, wird "interface" wieder entschlüsselt und ich habe meine Form -.-

zuerst hatte ich ja dom.CreateInstance versucht ... aber da wird dann auch die Assembly direkt von der Platte geladen ... der zweite Versuch war die Instanzierung direkt als Type - in der Hoffung das er dann aus dem "inneren" alles richtig verwendet ... öhm - Nein

ich bräuchte mal einen Tipp wie ich das richtig hinbekomme

hand, mogel


		private void PrepareFile(String source)
		{
			if (File.Exists(source))
			{
				Logging.info("codiere: " + source);
				byte[] asm = File.ReadAllBytes(source);
				for(int i = 0; i < asm.Length; i++) asm[i] = (byte) ((asm[i] ^ 0xff) & 0xff);
				File.WriteAllBytes(source, asm);
			}
		}


		private byte [] LoadAssembly(String name)
		{
			Logging.info("lade: " + name);
			String path = Path.Combine(Environment.CurrentDirectory, name);
			byte[] asm = File.ReadAllBytes(path);
			for(int i = 0; i < asm.Length; i++) asm[i] = (byte) ((asm[i] ^ 0xff) & 0xff);
			return asm;
		}