none
Fehler beim Ändern des Icons "System.Resources.MissingManifestResourceException" RRS feed

  • Frage

  • Hi Leute,

    wenn ich ein eigenes Icon einfügen möchte (*.ico-Datei) bekomme ich folgenden Fehler:

    Eine nicht behandelte Ausnahme des Typs "System.Resources.MissingManifestResourceException" ist in mscorlib.dll aufgetreten. Zusätzliche Informationen: Für die angegebene Kultur oder die neutrale Kultur konnten keine Ressourcen gefunden werden. Stellen Sie sicher, dass Form1.resources beim Kompilieren richtig in die Assembly CanTastaturKonfigurator eingebettet wurde, oder dass die erforderlichen Satellitenassemblys geladen werden können und vollständig signiert sind.

    Habe das Icon ganz normal über die Eigenschaft "Icon" meiner "Form1" ausgewählt. Der Code kompiliert auch fehlerfrei, nur beim Starten des Debuggings bricht er dann an folgender Codestelle ab:


    void Form1::InitializeComponent(void)
    {
     ...
     this->Icon = (cli::safe_cast<System::Drawing::Icon^>(resources->GetObject(L"$this.Icon"))); //Abbruch
     ...
    }
    

     

    Habe schon verschiedenes probiert, wie beispielsweise das hier: http://support.microsoft.com/kb/318603/de Aber es funktioniert nicht. Weiß jemand Rat?

     


    Dienstag, 19. April 2011 13:06

Antworten

  • Hab nach langem hin und her probieren den Fehler endlich gefunden! Mein Fehler ist es letzten endes im guten alten C++ Style den Code in Header (Deklaration) und CPP(Definition) trennen zu wollen. Der Compiler compiliert den Code zwar korrekt, und bringt bei vielen Dingen keinen Fehler, aber sobald man Resourcen verwendet funktioniert es nicht mehr.

    Man darf in der *.h die der Designer erstellt auf KEINEN Fall die folgenden 2 Dinge ändern:

    1) der namespace muss unverändert so stehen bleiben! Man darf ihn auch nicht umbenennen!

    2) Die Definition der Methode "void InitializeComponent(void)" muss in der Header bleiben!

    Zu 1) Ich lege mir normalerweise einen namespace für ein Projekt global an und verwende dann in allen anderen Dateien "using namespace meinNamespace;" Das ist rein semantisch korrekt, und alles compiliert fehlerfrei, nur beim Umgang mit Resourcen bringt es Fehler. Also den Namespace immer so lassen in der Form:

     

    //Form1.h
    #pragma once
    
    //RICHTIG:
    namespace meinNamespace	
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Threading;
    	
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    	...
    	};
    }
    //-------------------------------------------------------------
    //FALSCH:
    namespace meinNamespace	
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Threading;
    }
    
    using namespace meinNamespace;
    	
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    	...
    	};
    
    

    Zu 2) Da ich vom C++ komme, habe ich bisher immer nur die Prototypen der Methoden in der Header gelassen, und die eigentliche Definition in der *.cpp gemacht. Das bringt beim verwenden von Resourcen Fehler. Das Programm compiliert zwar wieder fehlerfrei, stürzt aber ab beim starten.

     

     

    //RICHTIG:
    //in Form1.h
    ...
    #pragma region Windows Form Designer generated code
    	void InitializeComponent(void)
    	{
    	this->components = (gcnew System::ComponentModel::Container());
    	...
    	}
    #pragma endregion
    
    //---------------------------------------------------
    //FALSCH:
    //in Form1.h
    #pragma region Windows Form Designer generated code
    	void InitializeComponent(void);
    #pragma endregion
    ...
    
    //in Form1.cpp
    ...
    void InitializeComponent(void)
    	{
    	this->components = (gcnew System::ComponentModel::Container());
    	...
    	}
    

     

     

    Falls jemand das gleiche Problem hat, hilft das hoffentlich weiter.


    Mittwoch, 6. Juli 2011 14:52

Alle Antworten

  • Hallo Seppel der Programmierer,

    Schau Dir mal die folgenden Links an. Vielleicht können sie Dir weiter helfen.

    Windows Form. Application throws exception after adding an Icon

    App Icon for C++ project

    Windows Form Icon

    Grüße,

    Robert

    Montag, 16. Mai 2011 11:26
    Moderator
  • Hallo Robert B.,

    dank dir für die Hilfe, habe mir alle Links durchgelesen und alles durch probiert, aber das Problem besteht leider immer noch. Zum Glück bin ich nicht der einzige mit diesem Fehler, es gibt schon ganz paar Beiträge dazu. Eine Lösung gibt es aber noch nicht.
    Vielleicht kann mir jemand die Codezeile genauer erklären, an der das Projekt fehlschlägt:

     

    this->Icon = (cli::safe_cast<System::Drawing::Icon^>(resources->GetObject(L"$this.Icon"))); //Abbruch
    
    

    Soweit ich diese Zeile verstehe, wird hier versucht dem Icon einen neuen "Wert" zu verpassen. Dieser neue "Wert" wird gecastet, somit wird der Typ welcher in ()-Klammern steht zum Typ in den <>-Klammern. Richtig soweit? Den Ausdruck in den ()-Klammern versteh ich nicht so richtig. Worauf bezieht sich dieses L"$this.Icon"?
    "resources" wird folgender maßen erzeugt:

    void Form1::InitializeComponent(void)
    	{
    	System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
    ....
    
    Vielleicht ist das auch wichtig für das Fehlerbild?!

     

    Donnerstag, 19. Mai 2011 07:27
  • Es sieht so aus, als ob die Ressource nicht in dem Projekt vorhanden ist, bzw. dort kein "$this.Icon" drin ist. Mach doch mal die Form1.resx-Datei auf und schau nach ob so eine Ressource drin ist.


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 19. Mai 2011 07:47
  • Hi Jochen K.,

    wenn ich die Form1.resx öffne, steht dort wirklich nix von einem Icon drin. Darin finde ich nur einen openFileDialog, saveFileDialog und eine statusStrip im Abschnitt "Andere".

    Habe mein Icon nun der Form1.resx hinzugefügt. Dort hat es jetzt auch den Namen "$this.Icon" insofern macht es jetzt schonmal Sinn was resources->GetObject(L"$this.Icon") versucht. Allerdings kommt der Fehler immernoch... Habe auch alles bereinigt und neuerstellt und dennoch der Fehler.

    Mir ist im Zuge dessen aber noch was anderes komisches aufgefallen. Es befindet sich zwar standardmäßig ein Icon namens "app.ico" in meinen Ressourcendateien im Projektmappen-Explorer, allerdings ist das nicht das Icon welches mir standardmäßig im Header meines Formulars angezeigt wird?!? Demnach zieht sich das Formular sein Icon irgendwoher... nur woher? Ich kanns im Projekt nirgends finden.

    Zusätzlich gibt es auch noch eine Datei "app.rc", welche ja auch zum "app.ico" zu gehören scheint. Wozu ist die gut? Wenn ich diese Datei öffne ist dort nur wieder das Icon von "app.ico" drin. Von meinem eigens eingebundenen Icon hat es zwar eine "key.ico" erstellt, aber keine "key.rc".

    Donnerstag, 19. Mai 2011 08:25
  • Toggle mal im des Form1 das Property "Localizable"!
    Setze es dann aber auf "false"!


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 19. Mai 2011 09:17
  • Habe ich gemacht. Localizable ist standardmäßig auf false. Habe hin u her geschalten, neu compiliert und die verschiedenen Möglichkeiten durchprobiert, aber der Fehler bleibt. Allerdings bleibt er an einer anderen Stelle mit selben Fehler stehen, wenn ich Localizable = true habe. Der Compiler fügt bei jedem Element ne zusätzlich Zeile ein, an der er beim Programmstart hängen bleibt, z.b.:

    resources->ApplyResources(this->buttonSchreiben, L"buttonSchreiben");
    

    Donnerstag, 19. Mai 2011 09:51
  • Mhn... ich habe die Vermutung das etwas mit dem Namen der Resource Datei nicht stimmt, bzw. das diese nicht richtig eingebunden wird. Der Compiler erzeugt mir eine Datei namens "MeinNamespace.Form1.resources". Beim Starten des Programms sucht er allerdings nach einer "Form1.resources" (siehe Fehlermeldung) und die gibt es nicht. Hat einer ne clevere Idee wo ich das in den Einstellungen prüfen könnte?

    Und noch eins: Könnte der Fehler damit zusammenhängen, weil ich kein Standard C++/CLI .NET Projekt mehr habe, in welchen alles in die Header Form1.h geschrieben wird, sondern ein angepasstes, in welchen ich eine Form1.cpp angelegt habe und damit Prototyp-Declarationen und Definitionen im guten C++ Style voneinander trenne?

    EDIT: Jap, scheint wirklich damit zu tun zu haben. Habe testweise ein neues Projekt angelegt, wo ich alles schön in der Header belasse und darin das Icon über die Eigenschaften geändert... und siehe da: so funktionierts ohne Fehler. Allerdings möchte ich mein Projekt jetzt nicht wieder komplett in die Header verschieben, zumal das auch Fehler bringen soll, wenn man mit mehreren Fenstern arbeitet (was ich später noch machen möchte).

    Donnerstag, 19. Mai 2011 12:32
  • Hab nach langem hin und her probieren den Fehler endlich gefunden! Mein Fehler ist es letzten endes im guten alten C++ Style den Code in Header (Deklaration) und CPP(Definition) trennen zu wollen. Der Compiler compiliert den Code zwar korrekt, und bringt bei vielen Dingen keinen Fehler, aber sobald man Resourcen verwendet funktioniert es nicht mehr.

    Man darf in der *.h die der Designer erstellt auf KEINEN Fall die folgenden 2 Dinge ändern:

    1) der namespace muss unverändert so stehen bleiben! Man darf ihn auch nicht umbenennen!

    2) Die Definition der Methode "void InitializeComponent(void)" muss in der Header bleiben!

    Zu 1) Ich lege mir normalerweise einen namespace für ein Projekt global an und verwende dann in allen anderen Dateien "using namespace meinNamespace;" Das ist rein semantisch korrekt, und alles compiliert fehlerfrei, nur beim Umgang mit Resourcen bringt es Fehler. Also den Namespace immer so lassen in der Form:

     

    //Form1.h
    #pragma once
    
    //RICHTIG:
    namespace meinNamespace	
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Threading;
    	
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    	...
    	};
    }
    //-------------------------------------------------------------
    //FALSCH:
    namespace meinNamespace	
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Threading;
    }
    
    using namespace meinNamespace;
    	
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    	...
    	};
    
    

    Zu 2) Da ich vom C++ komme, habe ich bisher immer nur die Prototypen der Methoden in der Header gelassen, und die eigentliche Definition in der *.cpp gemacht. Das bringt beim verwenden von Resourcen Fehler. Das Programm compiliert zwar wieder fehlerfrei, stürzt aber ab beim starten.

     

     

    //RICHTIG:
    //in Form1.h
    ...
    #pragma region Windows Form Designer generated code
    	void InitializeComponent(void)
    	{
    	this->components = (gcnew System::ComponentModel::Container());
    	...
    	}
    #pragma endregion
    
    //---------------------------------------------------
    //FALSCH:
    //in Form1.h
    #pragma region Windows Form Designer generated code
    	void InitializeComponent(void);
    #pragma endregion
    ...
    
    //in Form1.cpp
    ...
    void InitializeComponent(void)
    	{
    	this->components = (gcnew System::ComponentModel::Container());
    	...
    	}
    

     

     

    Falls jemand das gleiche Problem hat, hilft das hoffentlich weiter.


    Mittwoch, 6. Juli 2011 14:52