Tworzenie obiektów na podstawie nazwy klasy.

0

Witam,
zamierzam wprowadzić do swojego programu możliwość łatwej rozbudowy poprzez podgrywanie plików DLL.
Więc początkowo program działa przypuśćmy na 2 podgranych dll, skąd pobiera definicje o równych klasach.
Później dogrywamy kolejnych kilka bibliotek, i program potrafi już tworzyć 0biekty podgranych typów.

Cała lista wszystkich klas w poszczególnych zestawach jest określona np za pomocą pliku xml.

Przykład. (pseudokod)

XML: (każda klasa zawiera 2 atrybuty, id i nazwę)
Biblioteka1
Klasa1A
Klasa1B
Klasa1C
Biblioteka1
Biblioteka2
Klasa2A
Klasa2B
Biblioteka2

Używanie klas w programie głównym:
Program tworzy obiekt klasy o nazwie wybranej z pliku xml i wywołuje metodę X z tej klasy. Przypuśćmy ze wszystkie klasy dziedziczą po interfejsie posiadającym metodę X.

Jest jakaś możliwość tworzenia obiektów klasy na podstawie nazwy tej klasy podanej jako string?T

0

Activator.CreateInstance

0

Hasło na dzisiaj dla ciebie: C# Reflection

Na zachętę:

static object run(string classname, string methodname) {
Assembly asm = Assembly.Load(“mscorlib.dll”);
Type type = asm.GetType(classname);
object obj = asm.CreateInstance(classname);
0
javauser napisał(a)

Hasło na dzisiaj dla ciebie: C# Reflection

Na zachętę:

static object run(string classname, string methodname) {
Assembly asm = Assembly.Load(“mscorlib.dll”);
Type type = asm.GetType(classname);
object obj = asm.CreateInstance(classname);

na pierwszy rzut oka brzmi apetycznie xD
zaraz się zagłębię w szczegóły.

dzięki stary.

0

static object run(string classname, string methodname) {
Assembly asm = Assembly.Load(“mscorlib.dll”);
Type type = asm.GetType(classname);
object obj = asm.CreateInstance(classname);

Metoda CreateInstance(...) zwraca utworzony obiekt, jako typ object.
W jaki sposób można się dostać do składowych metod?
Rzutowanie odpada, ponieważ nie klasa nie będzie z góry określona.
Myślałem o rzutowaniu ew. na interfejs, który będzie dziedziczony przez wszystkie klasy.

Z ciekawości pytam, czy da się to inaczej obejść?
Może coś z delegacjami i metodą Invoke, albo jeszcze inaczej.
Póki co spróbuję zaimplementować mechanizm z interfejsami i rzutowaniem.
Docelowo, zobaczymy ;p

W dodatkowo potrzebuje tworzenia obiektów za pomocą konstruktora zparametrzowanego.
Więc jedyna szansa to chyba użycie metody CreateInstance(Type, Object[]) z klasy Activator.

0

Podczas ładowania biblioteki wystąpił błąd:
http://i47.tinypic.com/10wmhyx.png

Ścieżka jest 100% prawidłowa. Dodatkowo wykonałem test. Specjalnie podałem błędną ścieżkę, ale bląd się różnił. Brakowało końcówki HRESULT..

Zna ktoś problem?

1

A kliknąłeś chociaż na pierwszą od góry "troubleshooting tip"?

masz już to "Make sure" za sobą?

0

Czy chodzi o budowę biblioteki? A dokładniej ew. Atrybuty? Pierwszy raz operuje na bibliotekach w takim sensie. Nigdy wcześniej nie używałem atrybutów.

Moja lib1 ma budowę:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IFace;

namespace lib1
{
    public class Class1:IExecutable
    {
        private string message;

        public void WriteText(string message)
        {
            Console.WriteLine(message);
        }
        public Class1(string napis)
        {
            message = napis;
        }
    }
}

Dodam, że interfejs IExecutable zawiera tylko metodę WriteText. Co dodać, aby można było poprawnie ładować bibliotekę?

0

wrzuc to do main prze wywolaniem twojej funkcji Run
Console.WriteLine("Lib exists: {0}", System.IO.File.Exists(@"x:\lib1.dll"));
i powiedz co wypisuje?

0

No to chyba jasne i logiczne, że ścieżka jest prawidłowa. Przecież gdyby tak nie było, to zostałby rzucony FileNotFoundException. A skoro rzuca FileLoadException, to wina jest w pliku dll. Może nie jest biblioteką, nie jest podpisany, nie jest prawidłowo podpisany, itp...

0
somekind napisał(a)

No to chyba jasne i logiczne, że ścieżka jest prawidłowa. Przecież gdyby tak nie było, to zostałby rzucony FileNotFoundException. A skoro rzuca FileLoadException, to wina jest w pliku dll. Może nie jest biblioteką, nie jest podpisany, nie jest prawidłowo podpisany, itp...

dodam, że znalazłem obejście za pomocą metofy LoadFrom(string).
Wtedy wszystko działa, więc czemu jedna rzuca wyjątek, a druga nie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1