Announcement

Collapse
No announcement yet.

namespace - automatisch erstellt, jetzt nicht mehr gültig

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • namespace - automatisch erstellt, jetzt nicht mehr gültig

    Hallo Experten,

    ich habe ein Programm in Visual Studio 2008 Standard erstellt. Den Standard-Namespace MyProgram habe ich nicht verändert.
    Ich habe einige Klassen erstellt wie diese hier[highlight=c#]namespace MyProgram
    {
    /// <summary>
    /// A Class
    /// </summary>
    public class MyDerivedPanel:Panel
    {
    // Inhalt
    }
    }[/highlight]Die werden dann in Form1.Designer.cs behandelt[highlight=c#]namespace MyProgram
    {
    partial class Form1
    {
    // ...
    private void InitializeComponent()
    {
    // Jetzt kommt gleich der Fehler
    this.myDerivedPanel1 = new MyProgram.MyDerivedPanel();
    }

    private MyDerivedPanel myDerivedPanel1;
    }[/highlight]An der bezeichneten Stelle wirft mir Visual Studio beim Erstellen des Projektes dann vor:
    Fehler 7 Der Typname "MyDerivedPanel" ist im Typ "MyProgram.MyProgram" nicht vorhanden
    Lösche ich nun bei der Definition den namespace, so wie es bei der Deklaration auch der Fall ist, dann funktioniert das ganze. Der Namespace wird aber jedesmal wieder hingeschrieben, wenn ich im Designer irgendwas verändere.
    Mit mehreren Klassen wird die Löscherei ausgesprochen anstrengend.

    Ist das ein bekanntes Problem?
    Ist dazu eine Lösung bekannt?

  • #2
    Vorschlag: Schreib auch in den Klassen (hier: Form1) mit demselben Namespace vorneweg "using MyProgram;" und gib es beim Aufruf des Konstruktors nicht mehr an. Ich glaube, ich hatte ein ähnliches Problem auch schon mal und hatte mir damit geholfen. Jürgen

    Comment


    • #3
      Fehler 7 Der Typname "MyDerivedPanel" ist im Typ "MyProgram.MyProgram" nicht vorhanden
      Hast du etwas eine Klasse MyProgram im Namespace MyProgram? Das wäre dumm den dann sucht er das Panel in der Klasse nicht im Namespace.
      Merker : Nenne niemals eine Klasse wie einen Namespace. Siehe dazu auch die Namespace Naming Guidelines wie namespaces aussehen sollten und warum.

      Comment


      • #4
        Originally posted by Jürgen Thomas View Post
        gib ["MyProgram"] beim Aufruf des Konstruktors nicht mehr an.
        Das Weglassen des Namespaces funktioniert, wie schon im Ursprungsposting erwähnt:
        Originally posted by luker View Post
        Lösche ich nun [..] den namespace [..], dann funktioniert das ganze
        Aber ich müsste, ginge ich so vor, nach jeder noch so kleinen Änderung im Designer wieder die Löscherei beginnen, da der vom Designer generierte Code die Namespaces nunmal enthält.

        Ich brauche also eine Möglichkeit,
        - dem Designer das voranstellen von "MyProgram." auszureden, oder
        - dem Compiler mitzuteilen, dass der Namespace "MyProgram" sehrwohl die problematischen Klassen enthält.

        Comment


        • #5
          Originally posted by Ralf Jansen View Post
          Hast du etwas eine Klasse MyProgram im Namespace MyProgram?
          Ich fürchte, dem ist so.
          Aber da kann ich gar nix für. Das kam nämlich so: Die Klasse MyProgram.MyProgram ist
          Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
          Ich schätze also, es handelt sich dabei um etwas, das mit der Mehrsprachenunterstützung meines Programms zusammenhängt.
          Im Projekt existieren die Dateien

          - MyProgram.resx,
          - MyProgram.en-US.resx und
          - MyProgram.de-DE.resx.

          Jetzt, im Nachhinein, kann es durchaus sein, dass diese "Ich muss dauernd die Namespaces löschen"-Problematik seit der Einführung von Mehrsprachigkeit existiert.

          Soweit ich mich erinnern kann, sind die entsprechenden Klassen- und Dateinamen aber automatisch generiert.

          1. Wie finde ich die entsprechende Klasse?
          2. Kann ich sie umbenennen, ohne dass die Funktionalität beeinträchtigt wird?

          Comment


          • #6
            Kannst Du nicht einfach den Namespace Namen in Deinem Programm ändern? Ich denke das wäre wesentlich einfacher als einen Klassennamen einer Klasse zu ändern die Du nicht erstellt hast.

            Comment


            • #7
              1. Wie finde ich die entsprechende Klasse?
              2. Kann ich sie umbenennen, ohne dass die Funktionalität beeinträchtigt wird?
              Die Klasse wird automatisch aus der resx erstellt und muss so heißen wie die Assembly damit sie vom Lokalisierungsmechanismus gefunden wird.

              Meiner ersten Annahme namespaceName = KlasseName wahr wohl nicht ganz zutreffend. Du hast vermutlich namespaceName = AssemblyName gemacht ohne logische Gruppierung in diesen Namen. Und der Lokalisierungsmechanismus der sich nach dem Assemblynamen richtet liefert dir dann eine Klasse die wie der Namespace heißt.

              Du solltest deinen Assemblies und Namespaces richtige vernünftige Namen geben und zumindest den Namespaces nach den Guidelines benennen, also zumindest CompanyName.ProduktName[.Feature]. Dann hast du diese Probleme nicht.

              Comment


              • #8
                Originally posted by fanderlf View Post
                Kannst Du nicht einfach den Namespace Namen in Deinem Programm ändern? Ich denke das wäre wesentlich einfacher als einen Klassennamen einer Klasse zu ändern die Du nicht erstellt hast.
                Beides birgt Problempotential: Ändere ich den Namen der Klasse, so funktioniert das Programm weiterhin. Der Designer ändert den Namen aber spätenstens dann wieder zurück, wenn ich an den Ressourcen etwas ändere. Zum Beispiel wenn ich einen neuen Button einbaue. Der benötigt ja eine Beschriftung. Dafür fasse ich die Ressourcendatei an und bekomme wieder die Ressourcen-Klasse "MyProgram.MyProgram".

                Andersherum habe ich den Namespace geändert und erhalte zur Laufzeit eine MissingManifestResourceException.

                [Edit] Jetzt funktionierts mit geändertem Aufruf des Ressourcenmanagers:[highlight=c#]//m_resourceManager = new System.Resources.ResourceManager("MyProgram.MyProg ram", System.Reflection.Assembly.GetExecutingAssembly()) ;
                m_resourceManager = new System.Resources.ResourceManager("MyProgramNamespa ce.MyProgramNamespace", System.Reflection.Assembly.GetExecutingAssembly()) ;[/highlight]Mal sehen, wie lange.

                Bis dahin vielen Dank

                Comment


                • #9
                  Originally posted by luker View Post
                  Mal sehen, wie lange.
                  Bis jetzt.
                  Umbenennen der Ressourcen-Klasse wird bei Änderung an einer Ressource Rückgängig gemacht.
                  Umbenennen des Namespace führt dazu, dass sich bei Änderungen an einer Ressource die Ressourcen-Klasse dem neuen Namespace entsprechend selbst umbenennt.

                  Ich schätze, ich kann nur mit allen selbsterstellten Klassen in einen anderen Namespace umziehen und die längeren Bezeichner bei der Verwendung von Ressourcen akzeptieren.

                  Hat jemand eine andere Idee oder Bedenken, warum das nicht funktionieren könnte?

                  Comment

                  Working...
                  X