Announcement

Collapse
No announcement yet.

DLL aus dem Globaler Assemblycache wird nicht erkannt.

Collapse
This topic is closed.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DLL aus dem Globaler Assemblycache wird nicht erkannt.

    hallo Freunde,

    könnte Jemand mir bei dem folgenden Problem einen Tipp geben, waran die Fehlerursache liegt. Also ich möchte ich möchte ein DLL ins GAC(Globaler Assemblycache) rein tun, damit ich sie bei einigen SW-Komponenten einfach nutzen möchte, ohne impliziert darauf verweisen zu müssen. Ich habe anhand der Hinweise im folgen Link meine DLL erzeugt und ins GAC mit Hilfe gacutil.exe installiert:
    http://support.microsoft.com/kb/815808/de

    meine Schritte:
    1. Erstelung in Visual Studio ein neues Visual C#-Klassenbibliotheksprojekt GACDemo
    2. Generierung und Signierung meiner Assembly in Visual Studio 2005
    >die Projekteigenschaften
    >Signierung
    > Häckchen bei Signierung bei Asembly
    > Auswahl von "neu" im Kontext
    > Angabe des Dateinamen
    Zum Schluss wurde Projekt wurde erstellt und der Schritt 3 und Schritt 4 , auch Code Änderungen an der Datei AssemblyInfo.cs übersprungen.
    3. zuletzt habe ich dann mit gacutil meine DLL installiert.
    Gacutil - I "[DriveLetter]:\[PathToBinDirectoryInVSProject]\gac.dll"
    Das Ergebnis: meine DLL ist im GAC zu sehen.
    Mein Problem: ich kann aus dieser DLL leider nicht instanzieren oder anderes ausgedrückt, es ist in meinem Code gar nicht zu erkennen(sogar nach einem Neustart).

    was habe ich da falsch gemacht? hätte jemand eine Erfahrung damit oder eine Idee, wie es sonst geht? vielen Dank für Eure Zeit.

    Beste Grüsse

    burkut

    PS: Ich benutze VS2005.

  • #2
    Hallo,

    die Assembly muss trotzdem per Verweis eingebunden werden (sie muss nicht unbedingt schon im Verweis-Fenster angezeigt werden - dann durchsuchen, ...).

    Standardmäßig werden bei einem neuen Projekt nur diejenigen Assemblies automatisch eingebunden weil dies in der Projekt-Vorlage so definiert ist.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Originally posted by gfoidl View Post
      Hallo,

      die Assembly muss trotzdem per Verweis eingebunden werden (sie muss nicht unbedingt schon im Verweis-Fenster angezeigt werden - dann durchsuchen, ...).

      Standardmäßig werden bei einem neuen Projekt nur diejenigen Assemblies automatisch eingebunden weil dies in der Projekt-Vorlage so definiert ist.

      mfG Gü


      Durchsuchen heisst, dass ich die DLL vom Projekordner(ursprungliche Projektordner für DLL), nicht vom GAC (C:\Windows\assembly) suchen muss. stimmt das? wenn das so ist, was habe ich einen Vorteil vom GAC gewonnen. wenn ich für jede SW-Komponente einzelne diese DLL einzelne verweisen muss? oder verstehe ich irgendwas falsch? bitte seid ihr böse, wenn ich ne domme Frage gestellt habe...

      Gruss

      burkut

      Comment


      • #4
        Durchsuchen heisst, dass ich die DLL vom Projekordner(ursprungliche Projektordner für DLL), nicht vom GAC (C:\Windows\assembly) suchen muss. stimmt das? wenn das so ist, was habe ich einen Vorteil vom GAC gewonnen. wenn ich für jede SW-Komponente einzelne diese DLL einzelne verweisen muss? oder verstehe ich irgendwas falsch? bitte seid ihr böse, wenn ich ne domme Frage gestellt habe...
        Nö. Durchsuchen macht das Framework selbst. Egal von woher du zur Designzeit eine Assembly referenziert hast wenn dann zur Laufzeit diese Assembly angefordert wird wird immer im GAC nachgeschaut ob sich nicht dort eine passende Assembly befindet und wenn ja wird diese benutzt.

        Vorteil des GAC? Assemblies im GAC gelten grundsätzlich als sicher. Bedeutet es müssen keine Security Checks mehr beim laden stattfinden. Die Assemblies sind vorkompiliert. Heißt es liegt bereits ein Native Image vor das nicht erst noch durch den Jit Compiler erzeugt werden muss.

        Comment


        • #5
          hallo,

          Das GAC habe ich auch so verstanden, dass GAC Assemblies immer für jede SW-Komponenten bzw. Anwendung zur jederzeit zur Verfügung stehen sollten. Deswegen habe ich ja meine DLL ins GAC reingeschoben....

          Leider meine Anwendung erkennt meine DLL gar nicht. Also liefert Fehler schon bei der Erstellung, dass es aus der DLL gar nicht instanziert werden kann.
          Das war meine ursprungliche Frage und wollte wissen, was ich da falsch gemacht habe.

          Comment


          • #6
            Das GAC habe ich auch so verstanden, dass GAC Assemblies immer für jede SW-Komponenten bzw. Anwendung zur jederzeit zur Verfügung stehen sollten. Deswegen habe ich ja meine DLL ins GAC reingeschoben....
            Das tun sie auch. Du musst aber eine Assembly in deinem Programm immer noch referenzieren auch wenn sie im GAC ist. Sonst müsste ja Visual Studio oder deine spätere Anwendung immer automatisch alle Assemblies die im GAC sind laden damit sie dir sofort zur Verfügung stehen. Hast du mal in den GAC geschaut wie viele Assemblies in wie vielen verschiedenen Versionen da drin sind? Wie viele Terabyte an Hauptspeicher soll den dein Entwicklungsrechner bereithalten um die alle zu laden und im Speicher zu halten. Von der Ladezeit mal ganz abgesehen?

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Du musst aber eine Assembly in deinem Programm immer noch referenzieren auch wenn sie im GAC ist. Sonst müsste ja Visual Studio oder deine spätere Anwendung immer automatisch alle Assemblies die im GAC sind laden damit sie dir sofort zur Verfügung stehen.
              Sorry, Ich habe dann eine Assembly im GAC prinzipiel falsch vertanden. Ich dachte, dass sie ein Art von "Protected Globale Variable" in einer Sprache wie z.B. C#., dass man sie nicht modifizieren, aber gleich anwenden kann. Dem Anschein nach habe ich das Konzept bisschen anderes interpretiert. Danke Ralf.

              ich wollte so eine Art Server/Client Kommunikation mit .Net Remoting erstellen. z.B. Es sieht so aus:
              Client
              ||
              Client------------------------>Server<----------------------------------Client
              ^
              ||
              Client

              Da das Remote-Object im Server eine DLL ist, musste ich für jedes Client in einem Rechner(Lokal oder im Netz) einzelne verweisen. Um dies zu vermeiden, wollte ich GAC benutzen. sowie jetzt aussieht, würde GAC mir nicht hilfen. Habt ihr bitte einen Tipp, wie ich vorgehen könnte?

              Danke

              burkut

              Comment


              • #8
                Da das Remote-Object im Server eine DLL ist, musste ich für jedes Client in einem Rechner(Lokal oder im Netz) einzelne verweisen. Um dies zu vermeiden, wollte ich GAC benutzen. sowie jetzt aussieht, würde GAC mir nicht hilfen. Habt ihr bitte einen Tipp, wie ich vorgehen könnte?
                Verwende bei den Clients statt der tatsächlichen Klasse eine Schnittstelle. Die Schnittstelle in eine DLL - die DLL zu jedem Client.
                Die DLL mit der Klasse bleibt nur auf dem Server.

                Anmerkung: Bei WCF ist dies die einzig mögliche Vorgehensweise (nciht ohne Grund).

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Originally posted by gfoidl View Post
                  Verwende bei den Clients statt der tatsächlichen Klasse eine Schnittstelle. Die Schnittstelle in eine DLL - die DLL zu jedem Client.
                  Die DLL mit der Klasse bleibt nur auf dem Server.

                  Anmerkung: Bei WCF ist dies die einzig mögliche Vorgehensweise (nciht ohne Grund).

                  mfG Gü

                  Also d.h. ich kann nicht nur die DLL nicht irgendwo im System global lagern, sondern auch nicht vermeiden, die DLL(egal DLL für Interface oder Klasse) vom Server einzelne in meinen Klienten zu verweisen.

                  Gruss

                  Burkut

                  Comment


                  • #10
                    Ja, grundsätzlich schon.

                    Die Assembly könnte aber von einem Netzlaufwerk geladen wo jeweils die aktuelle Version liegt.
                    Wird aber mit Schnittstellen gearbeitet so sollte die Schnittstelle nachdem sie defniert wurde nicht geändert werden. Somit kann diese Assembly auch an die Clients verteilt werden.


                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Das wird wohl nicht mehr gebraucht

                      Siehe auch: http://www.mycsharp.de/wbb2/thread.php?threadid=74897


                      mfG Gü
                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                      Comment

                      Working...
                      X