Да. Необходимо использовать Assembly.LoadFrom
для загрузки блока в память, тогда можно использовать Activator.CreateInstance
для создания экземпляра предпочтительного типа. Необходимо будет посмотреть тип сначала использование отражения. Вот простой пример:
Assembly assembly = Assembly.LoadFrom("MyNice.dll");
Type type = assembly.GetType("MyType");
object instanceOfMyType = Activator.CreateInstance(type);
, Когда у Вас есть имя файла блока и имя типа, можно использовать Activator.CreateInstance(assemblyName, typeName)
, чтобы попросить, чтобы разрешение типа.NET разрешило это в тип. Вы могли обернуть это с попыткой/выгодой так, чтобы, если она перестала работать, можно было выполнить поиск каталогов, где можно конкретно сохранить дополнительные блоки, которые иначе не могли бы искаться. Это использовало бы предыдущий метод в той точке.
Рассмотрите ограничения различного Load*
методы. От MSDN документы...
[еще 117] информация о Контекстах Загрузки может быть найдена вLoadFile не загружает файлы в контекст LoadFrom, и не разрешает зависимости использование пути загрузки, как метод LoadFrom делает.
LoadFrom
документы.
Активатор. CreateInstance должен работать.
IFace object = (IFace)Activator.CreateInstance( "AssemblyName",
"TypeName" )
.Unwrap();
Примечание: имя типа должно быть полностью определенным типом.
Пример:
var aray = (IList)Activator.CreateInstance("mscorlib","System.Collections.ArrayList").Unwrap();
aray.Add(10);
foreach (object obj in aray)
{
Console.WriteLine(obj);
}
Да. У меня нет примеров, которые я сделал лично доступный прямо сейчас. Я отправлю позже, когда я найду некоторых. В основном Вы будете использовать отражение, чтобы загрузить блок и затем вытянуть безотносительно типов, в которых Вы нуждаетесь для него.
Тем временем, эта ссылка должна запустить Вас:
Используя отражение для загрузки не имеющих ссылки блоков во времени выполнения
((ISomeInterface)Activator.CreateInstance(Assembly.LoadFile("somePath").GetTypes()[0])).SomeInterfaceMethod();
Можно загрузить использование блока *блок. Загрузка ** методы. Используя Активатор. CreateInstance можно создать новые экземпляры типа, который Вы хотите. Следует иметь в виду, что необходимо использовать полное имя типа класса, который Вы хотите загрузить (например Пространство имен. SubNamespace. ClassName). Используя метод InvokeMember класс Типа можно вызвать методы на тип.
кроме того, примите во внимание, что когда-то загруженный, блок не может быть разгружен, пока целый AppDomain не разгружен также (это - в основном утечка памяти).
Завися, насколько внутренний этот вид функциональности к Вашему проекту, Вы могли бы хотеть рассмотреть что-то как MEF, который будет заботиться о загрузке и схождении компонентов для Вас.
Да, это, Вы захотите использовать метод статистической нагрузки на классе блока, и затем назвать тогда вызов методом CreateInstance на экземпляре блока возвращенный Вам от вызова для Загрузки.
кроме того, можно назвать один из других статических методов, запускающихся с "Нагрузки" на класс блока, в зависимости от потребностей.
Вы можете делать это следующим образом:
using System.Reflection;
Assembly MyDALL = Assembly.Load("DALL"); //DALL name of your assembly
Type MyLoadClass = MyDALL.GetType("DALL.LoadClass"); // name of your class
object obj = Activator.CreateInstance(MyLoadClass);