Benutzer mit den meisten Antworten
Wie kann ich mir die geladenen Assemblys anzeigen lassen.

Frage
-
Antworten
-
Hallo cathrin__,
ich denke du meinst das:
Assembly[] appAssemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < appAssemblies.Length; i++) Console.WriteLine("{0}: {1}\n", i + 1, appAssemblies[i].FullName); }
Falls nicht, bitte gezielt nachfragen.
Viele Grüße
Holger M. RößlerKaum macht man es richtig, schon funktioniert es
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 13. März 2012 17:07
- Als Antwort markiert sleepy007 Mittwoch, 14. März 2012 06:37
-
Hallo Cathrin,
geliefert wird bei Holger ein Assembly-Verweis, so dass Du auch die weiteren Infos abrufen kannst, zum Bleistift:
foreach(var ass in appAssemblies) { Console.WriteLine("{0}: {1} - {2}", ass.FullName, ass.CodeBase, ass.Location); }
Wegen der RuntimeBinderException würde ich aber nach einer ungültigen numerischen Zeichenfolge suchen.
Das wäre eine Funktion (bei Office), die einen Double-Wert erwartet, aber durch Deinen Aufruf aber eine Zeichenkette erhält.
Zur Verdeutlichung:
public static void DoubleFunction(dynamic value) { var dvalue = (double)value; Console.WriteLine("{0} => {1}", value, dvalue); } public static void DynamicDoubleCall() { try { // Passt dynamic doubleValue = 12.34; DoubleFunction(doubleValue); // kann implizit konvertiert werden dynamic intValue = 12; DoubleFunction(intValue); // Fehler dynamic doubleString = "12.34"; DoubleFunction(doubleString); } catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException rex) { Console.WriteLine("Binder Exception: {0}", rex.Message); } }
Wenn Du die Stelle ungefähr eingrenzen kannst, baue wie oben gezeigt eine Ausnahmebehandlung ein.
Damit aus dem String ein Double wird wäre dann ein Double.[Try]Parse notwendig.Gruß Elmar
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 13. März 2012 17:07
- Als Antwort markiert sleepy007 Mittwoch, 14. März 2012 10:13
Alle Antworten
-
Hallo cathrin__,
ich denke du meinst das:
Assembly[] appAssemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < appAssemblies.Length; i++) Console.WriteLine("{0}: {1}\n", i + 1, appAssemblies[i].FullName); }
Falls nicht, bitte gezielt nachfragen.
Viele Grüße
Holger M. RößlerKaum macht man es richtig, schon funktioniert es
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 13. März 2012 17:07
- Als Antwort markiert sleepy007 Mittwoch, 14. März 2012 06:37
-
Hallo Holger
geht genau in die richtige Richtung.
Ich sollte allerdings noch ein paar Andere Info´s auch haben so in der Art:
************** Geladene Assemblys **************
mscorlib
Assemblyversion: 4.0.0.0
Win32-Version: 4.0.30319.239 (RTMGDR.030319-2300)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
Microsoft.VisualStudio.Tools.Office.Runtime
Assemblyversion: 10.0.0.0
Win32-Version: 10.0.31007.0
CodeBase:
file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualStudio.Tools.Office.Runtime/v4.0_10.0.0.0__b03f5f7
f11d50a3a/Microsoft.VisualStudio.Tools.Office.Runtime.dll
----------------------------------------
System.Core
Assemblyversion: 4.0.0.0
Win32-Version: 4.0.30319.233 built by: RTMGDR
CodeBase:
file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
bei Deiner Version wird nur folgendes erzeugt:
1: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
2: Microsoft.VisualStudio.Tools.Office.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
3: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
4: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Das ganze hat folgenden Hintergrung:
Bei mir läuft meine Software und beim Kunden seit 2 Wochen nicht mehr, jetzt suche ich über die geladenen Assemblys den eventuellen Unterschied, nur wegen so einer Fehlermeldung:
************** Ausnahmetext **************
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Der string-Typ kann nicht in double konvertiert werden.
bei CallSite.Target(Closure , CallSite , Object )
Grüße- Bearbeitet sleepy007 Mittwoch, 14. März 2012 06:34
-
Hallo Cathrin,
geliefert wird bei Holger ein Assembly-Verweis, so dass Du auch die weiteren Infos abrufen kannst, zum Bleistift:
foreach(var ass in appAssemblies) { Console.WriteLine("{0}: {1} - {2}", ass.FullName, ass.CodeBase, ass.Location); }
Wegen der RuntimeBinderException würde ich aber nach einer ungültigen numerischen Zeichenfolge suchen.
Das wäre eine Funktion (bei Office), die einen Double-Wert erwartet, aber durch Deinen Aufruf aber eine Zeichenkette erhält.
Zur Verdeutlichung:
public static void DoubleFunction(dynamic value) { var dvalue = (double)value; Console.WriteLine("{0} => {1}", value, dvalue); } public static void DynamicDoubleCall() { try { // Passt dynamic doubleValue = 12.34; DoubleFunction(doubleValue); // kann implizit konvertiert werden dynamic intValue = 12; DoubleFunction(intValue); // Fehler dynamic doubleString = "12.34"; DoubleFunction(doubleString); } catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException rex) { Console.WriteLine("Binder Exception: {0}", rex.Message); } }
Wenn Du die Stelle ungefähr eingrenzen kannst, baue wie oben gezeigt eine Ausnahmebehandlung ein.
Damit aus dem String ein Double wird wäre dann ein Double.[Try]Parse notwendig.Gruß Elmar
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 13. März 2012 17:07
- Als Antwort markiert sleepy007 Mittwoch, 14. März 2012 10:13
-
Hallo Elmar,
ja, wenn es so einfach wäre.....
als Programmcode habe ich schon ein try eingebaut:
try { t = Convert.ToDouble(tb.Text); } catch (Exception ex) { MessageBox.Show(Properties.Resources._Cpk_Eingabe); return; }
und leider wird dieser catch aber beim Kunden wohl nicht ausgeführt, bei mir am Rechner schon.
Und für die Abfrage nach dem CodeBase und Location erhalte ich folgende Fehlermeldung:
Der aufgerufene Member wird in einer dynamischen Assembly nicht unterstützt.
Grüße
- Bearbeitet sleepy007 Mittwoch, 14. März 2012 06:47
-
Hallo Cathrin,
wenn man dynamischen Code verwendet, so erzeugt die Runtime dafür intern Assemblies zur Laufzeit im Speicher.
Dafür gibt es keine Codebase. Überprüfen kannst Du die aber eh nicht.Zum Programmcode - was erfolgversprechender ist:
Eine RuntimeBinderException kann bei Convert.ToDouble nicht auftreten.
Das passiert nur bei Aufrufen, die dynamischen Code - die Dynamic Language Runtime - verwenden.
Vermutlich (anhand der Assemblies oben) bei Dir erst durch den Aufruf einer Office Methode,
wofür die DLR ebenfalls genutzt wird.Der Code selbst wäre besser geschrieben als:
double t; if (!double.TryParse(tb.Text, out t)) t = -1.0; Console.WriteLine("t = {0}", t);
Wobei der evtl. wichtige Unterschied ist, das "t" hier mit einem Wert (-1 - andere wären denkbar)
besetzt wird, wenn die Konvertierung fehlschlägt.Summa Summarum: Du solltest die Stellen untersuchen, wo Du externe Bibliotheken (aka Office) aufrufst.
Gruß Elmar
-
Hallo Elmar,
danke für den Hinweis.
Ich hab jetzt noch an einer anderen Stelle was gefunden, wo der Fehler auftreten könnte.
Bin jetzt noch am Debugen mit den Kundenwerten, um das ganze einzugrenzen.
Der Hinweis mit dem dem Codebase kam aber von Dir. ;)
Grüße
-
Hallo Cathrin,
sicher kam der Hinweis auf Assembly von mir.
Dass eine dynamisch erzeugte Assembly (IsDynamic) keine Codebase hat,
ist mir zwar bekannt, nur hatte ich das im Schnipsel nicht berücksichtigt / bedacht.
Aber ein klein wenig Eigeninitiative müsstest Du schon mitbringen -
alles vorkauen geht nun mal nicht und von Deinem Code ist nicht gerade viel zu sehen ;-)
Gruß Elmar