Я думаю, что реальная (историческая) причина заголовочных файлов делала так же проще для разработчиков компилятора ... но тогда заголовочные файлы действительно дают преимущества. Проверьте этот предыдущий пост для дальнейших обсуждений ...
Вы можете сделать следующее:
с помощью System.Reflection; Сборка MyDALL = Assembly.Load ("DALL"); // DALL имя вашей сборки Тип MyLoadClass = MyDALL.GetType ("DALL.LoadClass"); // имя вашего объекта класса obj = Activator.CreateInstance (MyLoadClass);
((ISomeInterface) Activator.CreateInstance (Assembly.LoadFile ( "somePath") GetTypes () [0]).) SomeInterfaceMethod ().
Начиная с Framework v4.5 вы можете использовать Activator.CreateInstanceFrom (), чтобы легко создавать классы в сборках. В следующем примере показано, как его использовать и как вызвать метод, передающий параметры и возвращающее значение.
// Предполагая, что moduleFileName содержит полный или действительный относительный путь к сборке var moduleInstance = Activator.CreateInstanceFrom ( moduleFileName, "MyNamespace.MyClass"); МетодInfo mi = moduleInstance.Unwrap (). GetType (). GetMethod («MyMethod»); // Предполагая, что метод возвращает логическое значение и принимает один строковый параметр bool rc = Convert.ToBoolean (mi.Invoke (moduleInstance.Unwrap (), новый объект [] {"MyParamValue"}));
Рассмотрим ограничения различных методов Load *
. Из MSDN docs ...
LoadFile не загружает файлы в контекст LoadFrom и не разрешает зависимости, используя путь загрузки, как это делает метод LoadFrom.
Более подробную информацию о контекстах загрузки можно найти в документах LoadFrom .
Да, вам нужно использовать метод статической нагрузки в классе Assembly, а затем вызвать затем вызвать метод CreateInstance в экземпляре Assembly, возвращенный вам из вызова Load.
Кроме того, вы можете вызвать один из других статических методов, начиная с «Загрузить» в классе Assembly, в зависимости от ваших потребностей.
Это легко.
Пример из MSDN:
public static void Main () {// Использовать имя файла для загрузки сборки в текущее // приложение домен. Сборка a = Assembly.Load («пример»); // Получить тип для использования. Введите myType = a.GetType («Пример»); // Получить метод для вызова. MethodInfo myMethod = myType.GetMethod ("MethodA"); // Создаем экземпляр. object obj = Activator.CreateInstance (myType); // Выполнить метод. myMethod.Invoke (obj, null); }
Вот ссылка:
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx [ ! d5]
Вы можете загрузить сборку, используя методы * Assembly.Load **. Используя Activator.CreateInstance , вы можете создавать новые экземпляры нужного типа. Имейте в виду, что вы должны использовать полное имя типа класса, который хотите загрузить (например, Namespace.SubNamespace.ClassName ). Используя метод InvokeMember класса Type , вы можете вызывать методы типа.
Также учтите, что после загрузки сборка не может быть выгружается до тех пор, пока весь AppDomain не будет выгружен (это в основном утечка памяти).
Монтажная сборка = Assembly.LoadFrom («MyAssembly.dll»); Тип type = assembly.GetType («MyType»); dynamic instanceOfMyType = Activator.CreateInstance (тип);
Таким образом, вы можете использовать функции не с получением методаinfo, а затем вызывать его. Вы будете делать как этот экземплярOfMyType.MethodName (); Но вы не можете использовать Intellisense, потому что динамические типы вводятся во время выполнения, а не во время компиляции.
Тем временем эта ссылка должна начать вас:
Использование отражение для загрузки неучтенных сборок во время выполнения
Assembly assembly = Assembly.LoadFrom («MyNice.dll»); Тип type = assembly.GetType («MyType»); object instanceOfMyType = Activator.CreateInstance (type);
Когда у вас есть имя файла сборки и имя типа, вы можете использовать Activator.CreateInstance (assemblyName, typeName) для попросите разрешение типа .NET разрешить это в тип. Вы можете обернуть это с помощью try / catch, чтобы в случае сбоя вы могли выполнить поиск каталогов, где вы можете специально хранить дополнительные сборки, которые иначе не могли бы быть найдены. Это будет использовать предыдущий метод в этой точке.
Тип type = assembly.GetType («MyNamespace» + «.» + «MyType»);
– Cipi
14 February 2011 в 10:46
Я нашел этот вопрос, и некоторые ответы очень полезны, однако у меня были проблемы с путями, поэтому этот ответ будет охватывать загрузку библиотеки путем поиска пути к каталогу bin.
Первое решение:
string assemblyName = "library.dll"; string assemblyPath = HttpContext.Current.Server.MapPath ("~ / bin /" + assemblyName); Монтажная сборка = Assembly.LoadFrom (assemblyPath); Тип T = assembly.GetType («Company.Project.Classname»); Company.Project.Classname instance = (Company.Project.Classname) Activator.CreateInstance (T);
Второе решение
string assemblyName = "library.dll"; string assemblyPath = HttpContext.Current.Server.MapPath ("~ / bin /" + assemblyName); Монтажная сборка = Assembly.LoadFile (assemblyPath); (Company.Project.Classname) instance = (Company.Project.Classname) assembly.CreateInstance ("Company.Project.Classname");
Вы можете использовать тот же принцип для интерфейсов (вы бы создали класс, но добавляли к интерфейсу), например:
(Company.Project.Interfacename ) instance = (Company.Project.Interfacename) assembly.CreateInstance ("Company.Project.Classname");
Этот пример предназначен для веб-приложения, но аналогичный может быть использован для настольного приложения, только путь разрешен по-разному, например
Path.GetDirectoryName ( Application.ExecutablePath)
В зависимости от того, насколько характерна эта функциональность для вашего проекта, вы можете рассмотреть что-то вроде MEF , которое позаботится о загрузке и связывании компонентов для вас.
Activator.CreateInstance должен работать.
Объект IFace = (IFace) Activator.CreateInstance («AssemblyName», «TypeName») .Unwrap ();
Примечание: имя типа должно быть полностью квалифицированным.
Пример:
var aray = (IList) Активатор. CreateInstance ( "mscorlib", "System.Collections.ArrayList") Развертка (). aray.Add (10); foreach (объект obj в aray) {Console.WriteLine (obj); }
ТипName
должен быть полностью квалифицирован. Мне пришлось называть это так: Activator.CreateInstance («MyAssembly», «MyAssembly.TypeName»)
И это возвращает объект ObjectHandle
. Чтобы перейти к вашему интерфейсу, вам нужно сделать ObjectHandle.UnWrap ()
– Anthony Sottile
8 August 2011 в 22:29