none
Wie kann ich mir die geladenen Assemblys anzeigen lassen. RRS feed

  • Frage

  • Hallo,

    Wie kann ich mir die geladenen Assemblys anzeigen lassen.

    Zum Beispiel ausgabe in einer MessageBox oder in eine Datei schreiben.

    Ich bräuchte aucht dazu den Assemblynamen, version Win32-Version und die CodeBase.

    Danke im vorraus

    CD

    Dienstag, 13. März 2012 14:14

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ößler


    Kaum macht man es richtig, schon funktioniert es

    Dienstag, 13. März 2012 14:31
  • 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

    Dienstag, 13. März 2012 16:20
    Beantworter

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ößler


    Kaum macht man es richtig, schon funktioniert es

    Dienstag, 13. März 2012 14:31
  • 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
    Dienstag, 13. März 2012 15:05
  • 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

    Dienstag, 13. März 2012 16:20
    Beantworter
  • 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
    Mittwoch, 14. März 2012 06:41
  • 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

    Mittwoch, 14. März 2012 07:57
    Beantworter
  • 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

    Mittwoch, 14. März 2012 10:16
  • 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

    Mittwoch, 14. März 2012 11:39
    Beantworter