Apakah mungkin untuk instantiate objek pada saat runtime jika saya hanya memiliki nama DLL dan nama kelas, tanpa menambahkan referensi ke rakitan di proyek? Kelas mengimplementasikan antarmuka, jadi setelah saya instantiate kelas, saya kemudian akan melemparkannya ke antarmuka.
Nama majelis:
library.dll
Ketik nama:
Company.Project.Classname
EDIT: Saya tidak memiliki jalur absolut dari DLL, jadi Assembly.LoadFile
tidak akan berfungsi. DLL mungkin berada di root aplikasi, system32, atau bahkan dimuat di GAC.
sumber
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Pertimbangkan keterbatasan
Load*
metode yang berbeda . Dari dokumen MSDN ...Informasi lebih lanjut tentang Memuat Konteks dapat ditemukan di
LoadFrom
dokumen.sumber
Activator.CreateInstance seharusnya bekerja.
Catatan: Nama jenis harus merupakan jenis yang sepenuhnya memenuhi syarat.
Contoh:
sumber
TypeName
harus sepenuhnya memenuhi syarat. Saya harus menyebutnya seperti ini:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
Dan itu mengembalikan sebuahObjectHandle
. Untuk turun ke antarmuka Anda yang perlu Anda lakukanObjectHandle.UnWrap()
Saya menemukan pertanyaan ini dan beberapa jawaban sangat berguna, namun saya memang memiliki masalah jalur, jadi jawaban ini akan mencakup memuat perpustakaan dengan menemukan jalur direktori bin.
Solusi pertama:
Solusi kedua
Anda dapat menggunakan prinsip yang sama untuk antarmuka (Anda akan membuat kelas tetapi melakukan casting ke antarmuka), seperti:
Contoh ini untuk aplikasi web tetapi yang serupa dapat digunakan untuk aplikasi Desktop, hanya path yang diselesaikan dengan cara yang berbeda, misalnya
sumber
Mudah.
Contoh dari MSDN:
Berikut ini tautan referensi
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx
sumber
Mulai dari Framework v4.5 Anda dapat menggunakan Activator.CreateInstanceFrom () untuk dengan mudah instantiate kelas dalam majelis. Contoh berikut menunjukkan cara menggunakannya dan cara memanggil metode yang melewati parameter dan mendapatkan nilai balik.
sumber
Iya. Saya tidak punya contoh yang saya lakukan tersedia secara pribadi saat ini. Saya akan memposting nanti ketika saya menemukan beberapa. Pada dasarnya Anda akan menggunakan refleksi untuk memuat perakitan dan kemudian untuk menarik jenis apa pun yang Anda butuhkan untuk itu.
Sementara itu, tautan ini harus membantu Anda memulai:
Menggunakan refleksi untuk memuat rakitan yang tidak direferensikan saat runtime
sumber
sumber
Anda dapat memuat perakitan menggunakan metode * Assembly.Load **. Menggunakan Activator.CreateInstance Anda dapat membuat instance baru dari jenis yang Anda inginkan. Ingatlah bahwa Anda harus menggunakan nama tipe lengkap dari kelas yang ingin Anda muat (misalnya Namespace.SubNamespace.ClassName ). Menggunakan metode InvokeMember dari kelas Type Anda dapat memanggil metode pada tipe.
Juga, perhatikan bahwa setelah dimuat, sebuah perakitan tidak dapat dibongkar sampai seluruh AppDomain diturunkan juga (ini pada dasarnya adalah kebocoran memori).
sumber
Bergantung pada seberapa intrinsik fungsi ini pada proyek Anda, Anda mungkin ingin mempertimbangkan sesuatu seperti MEF yang akan menangani pemuatan dan pengikatan bersama komponen untuk Anda.
sumber
Jadi dengan cara ini Anda dapat menggunakan fungsi tidak dengan mendapatkan methodinfo, dan kemudian memohonnya. Anda akan melakukan seperti instanceOfMyType.MethodName (); Tapi Anda tidak bisa menggunakan Intellisense karena tipe dinamis diketik dalam runtime, bukan dalam waktu kompilasi.
sumber
Ya, itu, Anda akan ingin menggunakan metode Beban statis pada kelas Majelis, lalu panggil kemudian panggil metode CreateInstance pada instance Majelis yang dikembalikan kepada Anda dari panggilan ke Load.
Selain itu, Anda dapat memanggil salah satu metode statis lain yang dimulai dengan "Load" pada kelas Assembly, tergantung pada kebutuhan Anda.
sumber
Anda dapat melakukan ini dengan cara ini:
sumber