Temat: Problem z rzutowaniem obiektów
Panowie dziękuję za pomoc, ale w dalszym ciągu jest problem. Po wymianie maili z Maćkiem stwierdziłem, że opiszę trochę więcej na temat projektu co może naświetli szybciej rozwiązanie.
Otóż... zgadza się, buduje system wtyczek, a właściwie mam już zbudowany. Wszystko działa jak należy. W tym miejscu ważne jest, abym wspomniał, że moje biblioteki nie korzystają w żaden sposób z referencji do plików zawierających interface'y czy klasy pośrednie. Na chwilę obecną udało mi się osiągnąć wszystko czego potrzebowałem: mam dwukierunkową komunikację, tzn. jestem w stanie wywoływać metody z aplikacji Host jak również z biblioteki przez aplikację Host. Formę okna głównego z biblioteki wywołuję w sposób opisany przeze mnie powyżej (a poniżej przypomnę):
Assembly asm = Assembly.LoadFrom("biblioteka.dll");
foreach (Type asmTyp in asm.GetTypes())
{
if (asmTyp.IsPublic && !asmTyp.IsAbstract)
{
Type Interfejs = asmTyp.GetInterface("JakasPrzestrzen.MojInterface", true);
// MojInterface to tylko informacja dla Host, o tym, że biblioteka ma być
// załadowana przez program - interface nie zawiera żadnych deklaracji
if (Interfejs != null)
{
// to działa wspaniale:
// Form oModul = (Form)Activator.CreateInstance(asmZestaw.GetType(asmTyp.ToString()));
// tworzona jest instancja klasy Form1, która dziedziczy po Form
// a to już nie:
MojaForma oModul = (MojaForma)Activator.CreateInstance(asmZestaw.GetType(asmTyp.ToString()));
// MojaForma to klasa, która również dziedziczy po Form
// zawiera przeładowane metody, która zmieniają wygląd formy itp.
}
}
}
Pytanie brzmi dokładnie tak: w jaki sposób podmienić w locie obiekt klasy Form1 (ktory dziedziczy po Form) na obiekt klasy MojaForma (ktory również dziedziczy po Form i zawiera przeładowane metody zmieniające wygląd formy) ewentualnie w jaki sposób dokonać konwersji obiektu bazowego na obiekt docelowy? Przypominam, że w moim projekcie (plugin) nie wykorzystuję referencji do pliku z interface'ami (tak, wiem, że byłoby to znacznie prostsze rozwiązanie, ale niestety nie używam).
Jeszcze prościej:
- MojaForma działa na hoście i ma za zadanie skonfigurować wygląd graficzny dowolnego okienka. Do tego służą metody CreateParams, OnActivated, DisplayRectangle, OnCreateControl itd. itp. Reasumując: MojaForma ma jedną odpowiedzialność - skonfigurować wygląd;
- konkretne okienka tworzone są w pluginie - są to najzwyklejsze formularze tworzone przy użyciu designera VS które nic nie wiedzą o tym, że będą użyte przez hosta (i w jaki sposób);
- w efekcie chce otrzymać efekt połączenia jednego i drugiego, tzn. aby utworzony w pluginie Form1 jakoś magicznie - w runtime - odziedziczył z MojaForma wspomniane metody.
Chętnie udzielę innych informacji, jeśli ktoś zapyta, bo sam już nie wiem co jeszcze mógłbym napisać.
Edit: jestem w stanie pójść na kompromis i pozostawić rzutowanie na Form, ale mam zupełnie inny problem opisany w
tym wątku.
Rafał T. edytował(a) ten post dnia 23.12.09 o godzinie 23:59