Czy jest możliwe utworzenie instancji obiektu w czasie wykonywania, jeśli mam tylko nazwę DLL i nazwę klasy, bez dodawania odwołania do zestawu w projekcie? Klasa implementuje interfejs, więc kiedy utworzę instancję klasy, przerzucę ją na interfejs.
Nazwa zestawu:
library.dll
Wpisz imię:
Company.Project.Classname
EDYCJA: Nie mam absolutnej ścieżki do DLL, więc Assembly.LoadFile
nie będzie działać. Biblioteka DLL może znajdować się w katalogu głównym aplikacji, system32 lub nawet załadowana do GAC.
źródło
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Rozważ ograniczenia różnych
Load*
metod. Z dokumentów MSDN ...Więcej informacji na temat ładowania kontekstów można znaleźć w
LoadFrom
dokumentach.źródło
Activator.CreateInstance powinien działać.
Uwaga: Nazwa typu musi być w pełni kwalifikowanym typem.
Przykład:
źródło
TypeName
musi być w pełni wykwalifikowany. Musiałem nazwać to tak:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
I to zwracaObjectHandle
. Aby przejść do interfejsu, musisz zrobićObjectHandle.UnWrap()
Znalazłem to pytanie i niektóre odpowiedzi bardzo przydatne, ale miałem problemy ze ścieżką, więc ta odpowiedź obejmowałaby ładowanie biblioteki przez znalezienie ścieżki katalogu bin.
Pierwsze rozwiązanie:
Drugie rozwiązanie
Możesz używać tej samej zasady dla interfejsów (tworzysz klasę, ale rzutujesz na interfejs), takich jak:
Ten przykład dotyczy aplikacji sieci web, ale podobny można zastosować w przypadku aplikacji komputerowej, na przykład tylko ścieżkę można rozwiązać w inny sposób
źródło
To jest łatwe.
Przykład z MSDN:
Oto link referencyjny
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx
źródło
Począwszy od Framework v4.5 można użyć Activator.CreateInstanceFrom () w celu łatwego tworzenia instancji klas w złożeniach. Poniższy przykład pokazuje, jak z niego korzystać i jak wywołać metodę przekazującą parametry i otrzymującą wartość zwracaną.
źródło
Tak. Nie mam obecnie żadnych przykładów, które osobiście udostępniłem. Wyślę później, kiedy coś znajdę. Zasadniczo użyjesz odbicia, aby załadować zespół, a następnie wyciągnąć wszystkie potrzebne typy.
Tymczasem ten link powinien zacząć:
Używanie odbicia do ładowania niereferencyjnych zestawów w czasie wykonywania
źródło
źródło
Możesz załadować zestaw za pomocą metod * Assembly.Load **. Za pomocą Activator.CreateInstance możesz tworzyć nowe wystąpienia, które chcesz. Pamiętaj, że musisz użyć pełnej nazwy typu klasy, którą chcesz załadować (na przykład Namespace.SubNamespace.ClassName ). Z wykorzystaniem metody InvokeMember tego typu klasy można wywołać metody na typ.
Weź również pod uwagę, że po załadowaniu zestawu nie można rozładować, dopóki cała AppDomain również nie zostanie rozładowana (jest to w zasadzie wyciek pamięci).
źródło
W zależności od tego, jak istotna jest tego rodzaju funkcjonalność dla twojego projektu, możesz rozważyć coś takiego jak MEF, który zajmie się ładowaniem i wiązaniem ze sobą komponentów.
źródło
W ten sposób możesz korzystać z funkcji, które nie są potrzebne do uzyskania metody methodinfo, a następnie jej wywołania. Zrobisz to tak jak instanceOfMyType.MethodName (); Ale nie można używać Intellisense, ponieważ typy dynamiczne są wpisywane w czasie wykonywania, a nie w czasie kompilacji.
źródło
Tak, to znaczy, będziesz chciał użyć statycznej metody Load na klasie Assembly, a następnie wywołać, a następnie wywołać metodę CreateInstance w instancji Assembly zwróconej z wywołania Load.
Możesz także wywołać jedną z pozostałych metod statycznych, zaczynając od „Load” na klasie Assembly, w zależności od potrzeb.
źródło
Możesz to zrobić w następujący sposób:
źródło