MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как выгрузить c# библиотеку из CLR, не завершая процесса"
Answer 966828
В .NET Core начиная с версии 3.0 поддерживается выгрузка DLL без использования доменов приложений. В .NET Framework для того, чтобы DLL можно было выгрузить, ее необходимо загрузить в отдельный домен приложений и осуществлять любое взаимодействие с ней через класс-обертку, производный от MarshalByRefObject. Как-то так:
using System; using System.Collections; using System.Reflection; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void PrintLibs() { Process pr = Process.GetCurrentProcess(); using (pr) { pr.Refresh(); foreach (ProcessModule mod in pr.Modules) { if(mod.ModuleName.EndsWith(".ni.dll"))Console.WriteLine(mod.ModuleName); } } } static void Main(string[] args) { //создаем домен приложений AppDomain domain = AppDomain.CreateDomain("MyDomain"); //создаем обертку для удаленных вызовов Type type = typeof(Wrapper); Wrapper wrapper = (Wrapper)domain.CreateInstanceAndUnwrap( type.Assembly.FullName, type.FullName); //вызываем метод в MyDomain string s = wrapper.Invoke("SELECT Name FROM Win32_Processor", "Name"); Console.WriteLine(s); Console.WriteLine("*** Загруженные библиотеки до выгрузки домена: ***"); PrintLibs(); //выгружаем MyDomain AppDomain.Unload(domain); GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine("*** Загруженные библиотеки после выгрузки домена: ***"); PrintLibs(); Console.ReadKey(); } } public class Wrapper : MarshalByRefObject { public string Invoke(string query, string property) { string assemblyPath = "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\System.Management.dll"; Assembly ass = Assembly.LoadFile(assemblyPath); Type t = ass.GetType("System.Management.ManagementObjectSearcher"); object obj = Activator.CreateInstance(t, query); IEnumerable moc = (obj as dynamic).Get(); foreach (object item in moc) { return (item as dynamic).Properties[property].Value.ToString(); } return ""; } } } /* Результат: Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz *** Загруженные библиотеки до выгрузки домена: *** mscorlib.ni.dll System.ni.dll System.Core.ni.dll Microsoft.CSharp.ni.dll System.Management.ni.dll System.Dynamic.ni.dll *** Загруженные библиотеки после выгрузки домена: *** mscorlib.ni.dll System.ni.dll */
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.