Reflections - wie richtig nutzen ?
-
pack mal alles in eine ZIP und poste mal den Link zum Download ... ich versuche heute noch reinzuschauen - wenn mich mein Terrorist läßt
Ein Lichtblick.
String^ hilfe = arbeitsordnerholen () + "PlugIns\";
wenn das Verzeichnis im Verzeichnis des Programms liegt (also als Unterordner), dann brauchst Du den Arbeitsordner nicht ... im Normalfall kannst Du immer vom PRogrammverzeichnis aus direkt (also relativ) auf die Unterordner zugreifen
Ratschlag angenommen.
Beim Laden der Assemblys stehen keine Einträge in der Result List. Das liegt wohl hieran:
C++/CLI:
if ( t->IsPublic == true && t->IsSubclassOf (Interface::ISidepanelPlugIn) )ich weis jetzt nicht woher Du plugins hast ... aber da sollte ISidepanelPlugIn stehen
plugins ist so definiert:
protected: static System::Collections::Generic::List<Interface::ISidepanelPlugIn^> plugins = gcnew System::Collections::Generic::List<Interface::ISidepanelPlugIn^>();
for each(Type^ t in exAss->GetTypes()) { if ( t->IsPublic == true && t->IsSubclassOf (Interface::ISidepanelPlugIn))) { //Fehler von CreateInstance result->Add( safe_cast<Interface::ISidepanelPlugIn^>( Activator::CreateInstance(t) ) ); //vielleicht noch auf CreateInstance == null überprüfen }
...erhalte ich
Fehler 1 error C2275: 'Interface::ISidepanelPlugIn': Ungültige Verwendung dieses Typs als Ausdruck d:\C++ Backup\Sidebar\Sidebar\Form1.cpp 71
Aber der gefragte Typ ist doch "Interface::SidepanelPlugIn" - oder irre ich mich da?
-
Also,
Du hast alle Deine Plugins im Hauptprogramm mit drinnen ... wenn Du wirklich Plugins machen willst, dann sollten die raus in jeweils eine eigene DLL ... aber Du scheinst das ganze Prinzip noch nicht so richtig verstanden zu haben
ein Vorschlag von meiner Seite ... leg Dein aktuelles Projekt mal zur Seite ... fange ein neues Projekt zum Üben an ... eine DLL die das Interface enthält ... eine Programm was die Plugins nachläd ... und je eine DLL für das Plugin ... es geht hier nur darum das Du übst um das Prinzip zu verstehen ... Plugins haben nichts weiter zu tun als mit Vererbung - nur über mehrere Dateien verstreut
wenn Du das Prinzip verstanden hast, dann kannst Du Dein Projekt neu aufbauen
im übrigen hast kannst Du UserControls verwenden für die einzelnen Plugins ... bei mir war Dein Sidebar-Fenster offen ... dann kam meine Sidebar (die von Vista) und dann kamen die einzelnen Fenster von den Plugins ... wenn Du die auf UserControls änderst, dann kannst Du die mit
form1->Controls->Add( ... )
hinzufügen
dann hängen die auch immer zusammen
hand, mogel
-
Ich muss dir recht geben, dass ich einige Fehler begangen habe. Habe die Sidebar mal eben so angefangen - und mich erst in einem recht späten Stadium dazu entschlossen, mich doch mit einem PlugIn Mechanismus auseinanderzusetzen.
Aber daraus kann ich nur lernen. Die PlugIns sind natürlich zu früherer Stunde entstanden - und wurden dann einfach instanziert. Als ich mich entschlossen habe das ganze via DLL zu lösen, habe ich dann einfach das laden der Panels unterbunden, und das ganze mit den dir ja bekannten Funktionen zu erledigen.
Das Problem mit dem überlagern der Form usw. steht auch schon auf meiner Liste. Gefällt mir auch nicht. Das passiert eben bei einer NULL Planung. Die UserControls sind seit gestern ein völlig neuer Aspekt, in den ich mich erst mal einarbeiten muss.
Aber ich würde auf jeden Fall gerne DIESES Problem behoben wissen, oder hällst du das nicht sinnvoll? Lieber wärs mir schon.
-
shaun1981 schrieb:
Das Problem mit dem überlagern der Form usw. steht auch schon auf meiner Liste. Gefällt mir auch nicht. Das passiert eben bei einer NULL Planung. Die UserControls sind seit gestern ein völlig neuer Aspekt, in den ich mich erst mal einarbeiten muss.
UserControl ist prinzipell nur eine Form ohne Fensterrahmen ... ansonsten ändert sich nix
Aber ich würde auf jeden Fall gerne DIESES Problem behoben wissen, oder hällst du das nicht sinnvoll? Lieber wärs mir schon.
ob es sich lohn das ganze in Plugins auszulagern - ja sicher ... ich habe auch schon überlegt eine Sidebar zu basteln - da die unter Windows 7 wieder entfernt wurde (AFAIK) - aber habe keine Zeit dazu ... und da hätte ich auch wieder mit Plugins gearbeitet ... könnte ja sein das die Sidebar mal berühmt wird
... und bevor 20.000 Menschen am Quelltext pfuschen macht sich da alles als Plugin einfacher
hand, mogel
-
Also dann kann ich mein Projekt ja gleich zum Wind schießen. Du schnippst dir das wohl mal eben aus dem Finger was
? Aber nun lass dir doch nicht alles aus der Nase ziehen. Was mache ich denn so Falsch?
-
shaun1981 schrieb:
Also dann kann ich mein Projekt ja gleich zum Wind schießen.
nein - wieso?
Du schnippst dir das wohl mal eben aus dem Finger was
?
nein - reine Übungssache ... Datenbanken beschränkt sich bei mir nur auf SELECT & Co. ... ich weis das es Transaktionen gibt - aber noch nie verwenden müssen ... also den ganzen SQL-Kram aus dem Framework habe ich noch nie verwendet ... und unter Java spreche ich MySQL auch nur mit den SELECT's und fische alles einzeln
Aber nun lass dir doch nicht alles aus der Nase ziehen. Was mache ich denn so Falsch?
Du sollts einfach mal üben ... Du kannst zum Beispiel Calculon erweitern (auch wenns VB.NET ist - oder setze es erstmal auf C++/CLI um) ... weitere Operationen (also Plugins) hinzufügen ... dann das Interface erweitern und die Plugins entsprechend anpassen ... zum Beispiel könnten die Plugins ein UserControl mit einer Grafik zurück liefern - das Du dann entsprechend auf der Form anzeigen kannst
wenn Du dann das Prinzip verstanden hast, dann kannst Du Deine Struktur für Deine Sidebar nochmal überdenken bzw. überarbeiten ... und dann den Plugin-Mechanismuss für die Plugins umsetzen
hand, mogel
-
Nun wollte ich ein kleines Übungsprojekt starten - um der Sache mit den Interfaces näher zu kommen, und habe gleich ein mir neues - völlig unerklärliches Problem:
Ich möchte nun das Interface erstellen, klicke auf neues Projekt, Win32 - Projekt, DLL und Leeres Projekt. Dann erstelle ich ein neues Headerfile und schreibe den ja bekannten Code hinein:
namespace Interface { public interface ref class Schnittstelle { ... }; }
Das versuche ich zu kompilieren und erhalte folgenden Fehler:
Fehler 1 general error c10100b1: Failed to load file "..\Debug\hilfsprojekt.dll". The system cannot find the path specified. mt.exe
Das passiert bei jedem Projekt. Die DLL wird einfach nicht erstellt und ist im Ordner demnach auch nicht vorhanden. Ich kann mir das absolut nicht erklären - woran das auf einmal liegen sollte.
Habe auch schon versucht das Ausgabeverzeichniss zu ändern - aber auch das hilft mir nicht.
Buildprotokoll Neu erstellen wurde gestartet: Projekt: "hilfsprojekt", Konfiguration: "Debug|Win32"
Befehlszeilen Die temporäre Datei "c:\Users\Jan\Documents\Visual Studio 2008\Projects\DLLinterface\hilfsprojekt\Debug\RSP0002A519003424.rsp" wird erstellt. Inhalt:
[
/outputresource:"..\Debug\hilfsprojekt.dll;#2" /manifest".\Debug\hilfsprojekt.dll.intermediate.manifest"
]Erstellen der Befehlszeile "mt.exe @"c:\Users\Jan\Documents\Visual Studio 2008\Projects\DLLinterface\hilfsprojekt\Debug\RSP0002A519003424.rsp" /nologo" Ausgabefenster Das Manifest wird eingebettet...
mt.exe : general error c10100b1: Failed to load file "..\Debug\hilfsprojekt.dll". The system cannot find the path specified.
Ergebnisse Das Buildprotokoll wurde unter "file://c:\Users\Jan\Documents\Visual Studio 2008\Projects\DLLinterface\hilfsprojekt\Debug\BuildLog.htm" gespeichert.
hilfsprojekt - 1 Fehler, 0 Warnung(en)Eine Idee hierzu ?
-
ich tippe dann nochmal auf "Erstellen" (nicht "Neu Erstellen") ... beim Zweiten mal passt alles ... scheint aber ein generelles Problemzu sein ... MS wird das wohl in VS2010 fixen ... hast Du den Header schon in eine CPP eingebunden?
-
Das Problemchen ist gelöst. Habe einfach eine Komponenten Klasse erstellt und diese angepasst. Damit läufts. Komme auch ein wenig weiter - freu.
-
Hallo nochmal. Also ... hänge jetzt wieder einige Tage an einem Problem und bin echt am verzweifeln. Ich bekomme es einfach nicht hin, die PlugIn Klasse vom Interface abzuleiten:
PlugIn
#pragma once using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; namespace Sidebar { public ref class panel : public UserControl { public: void InitializePanel (); public: panel(void) { InitializeComponent(); InitializePanel (); } protected: ~panel() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::ListBox^ listBox1; protected: private: System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code void InitializeComponent(void) { System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(panel::typeid)); this->button1 = (gcnew System::Windows::Forms::Button()); this->listBox1 = (gcnew System::Windows::Forms::ListBox()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(39, 55); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(102, 30); this->button1->TabIndex = 0; this->button1->Text = L"Test Panel"; this->button1->UseVisualStyleBackColor = true; // // listBox1 // this->listBox1->FormattingEnabled = true; this->listBox1->Location = System::Drawing::Point(55, 19); this->listBox1->Name = L"listBox1"; this->listBox1->Size = System::Drawing::Size(71, 30); this->listBox1->TabIndex = 1; // // panel // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"$this.BackgroundImage"))); this->Controls->Add(this->listBox1); this->Controls->Add(this->button1); this->Name = L"panel"; this->Size = System::Drawing::Size(180, 140); this->ResumeLayout(false); } #pragma endregion }; public class panelPlugin : public Interface { public: virtual UserControl ^getSidebarUC() override { return gcnew Sidebar::panel (); } String ^getAuthor() { return "Shaun"; } String ^getName() { return "Testpanel - 14 Tage später"; } };
Interface
namespace Sidebar { public interface class Interface { public: UserControl^ getUserControl (); public: String ^getAuthor(); public: String ^getName(); public: Point getPanelPosition (); public: Size getpanelGröße (); public: void setÜberschrift (String^); }; }
Wie vorher habe ich das Interface als Verweis hinzugefügt. Versuche ich nun hier zu kompilieren erhalte ich ...
Fehler 2 error C3668: "Sidebar::panelPlugin::getSidebarUC": Die Methode mit dem Überschreibungsspezifizierer "override" hat keine Basisklassenmethoden überschrieben. d:\c++ backup\sidebar\testpanel\panel.h 87
Fehler 1 error C2504: 'Interface': Basisklasse undefiniert d:\c++ backup\sidebar\testpanel\panel.h 86.. wobei mir der erste Fehler doch sagen will, dass Interface unbekannt ist. Der zweite leuchtet mir auch ein. Ich verstehe einfach nicht warum das nicht funktioniert, zumal Sidebar::Interface doch bekannt sein sollte - und auch im IntelliSense auftaucht.
Definiere ich die Klassen direkt hintereinander ...
this->Name = L"panel"; this->Size = System::Drawing::Size(180, 140); this->ResumeLayout(false); } #pragma endregion }; public interface class Interface2 { public: UserControl^ getUserControl (); public: String ^getAuthor(); public: String ^getName(); }; public ref class panelPlugin : Interface2 { public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); } public: virtual String ^getAuthor() { return "Shaun"; } public: virtual String ^getName() { return "Testpanel - 4 Tage später"; } };
Ist die Ableitung kein Problem. Woran liegt das ?
-
*hehe*,
in Dein Fehler basiert darauf das Du im Plugin die Methode getSidebarUC() überschreibst ... die ist in der Tat nicht im INterfache definiert - da ist es getUserControl() ... das Lustige daran ist aber das Du es - als Du beides in eine Datei packst - die Klassenmethoden richtig schreibst - getUserControl() ... im Interface und Plugin
hand, mogel
BTW: deutsche Umlaute sind ungünstig im Quelltext
-
Jetzt wo du es sagst - habe ich ihn auch gesehen
... ist aber nicht mehr aktuell. Die Methode heißt nun definitiv getUserControl, der Verweis besteht, und beim Versuch das ganze abzuleiten:
namespace Sidebar { public interface class Interface { public: UserControl^ getUserControl (); public: String ^getAuthor(); public: String ^getName(); }; }
this->Name = L"panel"; this->Size = System::Drawing::Size(180, 140); this->ResumeLayout(false); } #pragma endregion }; public interface class Interface2 { public: UserControl^ getUserControl (); public: String ^getAuthor(); public: String ^getName(); }; public ref class panelPlugin : public Sidebar::Interface { public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); } public: virtual String ^getAuthor() { return "Shaun"; } public: virtual String ^getName() { return "Testpanel - 4 Tage später"; } };
Fehler 2 error C2504: 'Interface': Basisklasse undefiniert d:\c++ backup\sidebar\testpanel\panel.h 94
Fehler 1 error C2039: 'Interface': Ist kein Element von 'Sidebar' d:\c++ backup\sidebar\testpanel\panel.h 94und nu?
-
Ändere ich den Namensbereich des Interface - ist dieser im PlugIn seltsamerweise NICHT mehr bekannt. Ich habe das Gefühl - das ich irgendwas mit dem einbinden nicht richtig mache, und frage mal ganz dumm:
"Sollte der Namespace des Interfaces bekannt sein, allein durch einen Verweis auf die Interface.dll ?"
-
nein ... ein using muss - soweit Interface und Plugin nicht im gleichen NS sind - immermit angegeben werden ... zerleg mal Deine DLLs mit Reflector ... damit werfe ich immer einen Blick rein um zu sehen ob das mit den NS etc. passt
-
Joa .. DLL sieht aus wie von mir definiert.
Nach einer langen Nachtschicht hab ich mich noch mal nen bisschen an den Rechner gesetzt - weil mich dieses verdammte Problem einfach nicht in Ruhe lässt.
// Interface.h #pragma once using namespace System; using namespace System::Windows::Forms; namespace SidebarInterface { public interface class Interface { public: UserControl ^getUserControl(); public: String ^getAuthor(); public: String ^getName(); }; }
Testpanel
public ref class panelPlugin : public SidebarInterface::Interface , public Sidebar::DLLpanelklasse { public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); } public: virtual String ^getAuthor() { return "Shaun"; } public: virtual String ^getName() { return "Testpanel - 4 Tage später"; } };
Testpanel hat die erforderlichen Verweise auf das Interface und die DLLpanelklasse. Ich weiß nicht warum - aber das läuft so - ohne Using - und vor allem - AUF EINMAL DOCH?.
Nun zurück zum eigentlichen Übel:
void Sidebar::Form1::panelseinlesen () { using namespace System::Reflection; System::Reflection::Assembly ^exAss; System::Collections::Generic::List<SidebarInterface::Interface^>^ result = gcnew System::Collections::Generic::List<SidebarInterface::Interface^>(); for each(String^ fileName in System::IO::Directory::GetFiles (arbeitsordnerholen () + "PlugIns\\","*.dll")) { if (fileName->Contains ("DLLpanelklasse") || fileName->Contains ("Interface")) continue; // hier eine Fehlerbehebung für Fehler von LoadFrom try{ exAss = ::Reflection::Assembly::LoadFrom (fileName); } catch (Exception^) { continue; }; for each(Type^ t in exAss->GetTypes()) { if ( t->IsPublic && t->GetInterface (SidebarInterface::Interface::typeid->ToString ())) { Reflection::MethodInfo ^ test = t->GetMethod ("getUserControl"); if (test == nullptr) continue; result->Add(safe_cast<SidebarInterface::Interface^>(Activator::CreateInstance(t))); //result->Add( (SidebarInterface::Interface^)Activator::CreateInstance(t) ) ; } } } }
(Arbeitsordnerholen habe ich hier noch drin, da mir sonst eine Exception ausgeworfen wird. Irgendwie stimmt dann das Verzeichniss nicht. Aber darum kümmere ich mich später - wenn ich geschlafen habe
Viel wichtiger ...
Im For each Teil hast mir vorgeschlagen:
... t->isSubClassOf (...)
Nun habe ich aber das gefunden:
Die IsSubclassOf-Methode kann nicht verwendet werden, um zu bestimmen, ob eine Schnittstelle von einer anderen Schnittstelle abgeleitet ist oder eine Klasse eine Schnittstelle implementiert. Verwenden Sie für diesen Zweck die GetInterface-Methode.
Nun bin ich mir nicht sicher, ob ich etwas falsch verstanden habe, oder ob dir vielleicht ein Fehler unterlaufen ist - was ich eigentlich nicht glaube. Jedenfalls wird nun die richtige Klasse gefunden - welche ich nun Instanzieren möchte.
Im ersten "result->Add" wird mir diese Exception ausgeworfen:
Eine nicht behandelte Ausnahme des Typs "System.Reflection.TargetInvocationException" ist in mscorlib.dll aufgetreten.
-
shaun1981 schrieb:
public ref class panelPlugin : public SidebarInterface::Interface , public Sidebar::DLLpanelklasse
mir ist unklar wieso Du hier zwei mal erbst ... vom Interface reicht es eigentlich - sofern Du später auch dahin castest
Im For each Teil hast mir vorgeschlagen:
... t->isSubClassOf (...)nicht wirklich ... ich bvorzuge an der Stelle Assembly::CreateInstance ... wobei sich der Name - bei mir immer - wie folgt aufbaut
eindeutig.fester.namepace.DLL-Name.fester-Klassenname
alternativ würde auch ein Konfigurationsfile gehen wo die entsprechenden Infos drinnen stehen
hand, mogel
-
Das sieht gut aus. Jetzt klappt es auch mit dem Cast. Bspw. GetAuthor kann ich nun aufrufen. Allerdings bekomme ich beim abrufen des UserControls folgenden Fehler:
Eine nicht behandelte Ausnahme des Typs "System.Resources.MissingManifestResourceException" ist in mscorlib.dll aufgetreten.
Zusätzliche Informationen: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Sidebar.panel.resources" was correctly embedded or linked into assembly "Testpanel" at compile time, or that all the satellite assemblies required are loadable and fully signed.
und zwar bei der Funktion InitializeComponent der PlugIn Form. Genauer gesagt, beim abrufen des Hintergrunds durch diese Zeile:
//this->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"$this.BackgroundImage")));
Kommentiere ich diese aus - alles Ok.
-
Erstmal ein riesiges Danke an euch bzw. dich - Mogel. Soviel Geduld muss man erstmal haben
Nun ist es ja so, dass die DLLpanelklasse ja eine wesentliche Rolle in dem ganzen spielte. Hier ist ja bspw. das Titel Label, die Basis - Kontext Menüs usw. Wie gehe ich nun vor, damit diese mir auch zur Verfügung stehen ?
-
Gehen wir davon aus, dass die DLLpanelklasse nun als DLL vorliegt.
Versucht habe ich es so:
Testpanel
namespace Sidebar { public ref class panel : public Sidebar::DLLpanelklasse { public: void InitializePanel (); public: panel(void) { InitializeComponent(); InitializePanel ( ... ... public ref class panelPlugin : public SidebarInterface::Interface { public: virtual UserControl ^getUserControl() { return (dynamic_cast<UserControl^>( gcnew Sidebar::panel () ) ); } public: virtual String ^getAuthor() { return "Shaun"; } public: virtual String ^getPlugTitle () { return "Testpanel"; } };
Soweit auch OK. Beim aufruf von getUserControl wird auch gleich von der DLLpanelklasse abgeleitet, wobei es hier zu fehlern kommt:
DLLpanelklasse
this->standardmenü->SuspendLayout(); this->SuspendLayout(); // // überschriftlabel // resources->ApplyResources(this->überschriftlabel, L"überschriftlabel"); // <-- hier
Eine nicht behandelte Ausnahme des Typs "System.Resources.MissingManifestResourceException" ist in mscorlib.dll aufgetreten.
Zusätzliche Informationen: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Sidebar.DLLpanelklasse.resources" was correctly embedded or linked into assembly "DLLpanelklasse" at compile time, or that all the satellite assemblies required are loadable and fully signed.
-
Also .. ein paar Schwierigkeiten gibt es noch. Hier mal der aktuelle Stand:
Testpanel
namespace Sidebar { public ref class panel : public DLLpanelklasse::BASISpanel { public: void InitializePanel (); public: panel(void) { InitializeComponent(); InitializePanel (); } protected: ~panel() { if (components) { delete components; } } private: System::Windows::Forms::PictureBox^ pictureBox4; protected: private: System::Windows::Forms::PictureBox^ pictureBox3; private: System::Windows::Forms::PictureBox^ pictureBox2; private: System::Windows::Forms::PictureBox^ pictureBox1; protected: private: System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code void InitializeComponent(void) { System::ComponentModel::ComponentResourceManager^ resources = gcnew System::ComponentModel::ComponentResourceManager ( (Assembly::GetExecutingAssembly ())->GetType () );//gcnew System::ComponentModel::ComponentResourceManager(panel::typeid)); this->pictureBox4 = (gcnew System::Windows::Forms::PictureBox()); this->pictureBox3 = (gcnew System::Windows::Forms::PictureBox()); this->pictureBox2 = (gcnew System::Windows::Forms::PictureBox()); this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox()); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox4))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox3))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox2))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit(); this->SuspendLayout(); // // pictureBox4 // resources->ApplyResources(this->pictureBox4, L"pictureBox4"); this->pictureBox4->BackColor = System::Drawing::Color::Transparent; this->pictureBox4->Name = L"pictureBox4"; this->pictureBox4->TabStop = false; // // pictureBox3 // resources->ApplyResources(this->pictureBox3, L"pictureBox3"); this->pictureBox3->BackColor = System::Drawing::Color::Transparent; this->pictureBox3->Name = L"pictureBox3"; this->pictureBox3->TabStop = false; // // pictureBox2 // resources->ApplyResources(this->pictureBox2, L"pictureBox2"); this->pictureBox2->BackColor = System::Drawing::Color::Transparent; this->pictureBox2->Name = L"pictureBox2"; this->pictureBox2->TabStop = false; // // pictureBox1 // resources->ApplyResources(this->pictureBox1, L"pictureBox1"); this->pictureBox1->BackColor = System::Drawing::Color::Transparent; this->pictureBox1->Name = L"pictureBox1"; this->pictureBox1->TabStop = false; // // panel // resources->ApplyResources(this, L"$this"); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->Controls->Add(this->pictureBox4); this->Controls->Add(this->pictureBox3); this->Controls->Add(this->pictureBox2); this->Controls->Add(this->pictureBox1); this->Name = L"panel"; this->Controls->SetChildIndex(this->überschriftlabel, 0); this->Controls->SetChildIndex(this->pictureBox1, 0); this->Controls->SetChildIndex(this->pictureBox2, 0); this->Controls->SetChildIndex(this->pictureBox3, 0); this->Controls->SetChildIndex(this->pictureBox4, 0); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox4))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox3))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox2))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->EndInit(); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion }; public ref class panelPlugin : public SidebarInterface::Interface { public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); } public: virtual String ^getAuthor() { return "Shaun"; } public: virtual String ^getPlugTitle () { return "Testpanel"; } }; }
DLLpanelklasse
namespace DLLpanelklasse { public ref class BASISpanel : public System::Windows::Forms::UserControl { public: BASISpanel(void) { InitializeComponent(); } protected: ~BASISpanel() { if (components) { delete components; } } protected: static System::Collections::Generic::List<Control^> panelliste = gcnew System::Collections::Generic::List<Control^>(); protected: System::Media::SoundPlayer^ FXeffekt; protected: static System::Drawing::Size größe; // <-- Zum temporären Speichern der Panel Größe (Maximieren / Minimieren) protected: static int errorcount = 0; public: static Form^ form1instanz ; protected: static int abstandspanel = 0, ABSTAND = 6, panelanzahl = 0; ... ...
Probleme treten hier wieder mit dem RessourceManager auf - mit der gleichen Fehlermeldung wie im obigen Post. Jedoch verstehe ich nicht warum.