卸载加载了Assembly.LoadFrom()的Assembly

| 加载dll后,我需要检查运行GetTypes()的时间。 代码如下。
Assembly assem = Assembly.LoadFrom(file);
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;
我想卸载并重新加载dll,以检查再次运行GetTypes()所花费的时间。 如何卸载?
assem = null
够用吗? 有没有一种明确的方法可以调用垃圾回收器来回收分配给Assem的资源?     
已邀请:
        不幸的是,一旦装配被加载,您将无法卸载装配。但是您可以卸载AppDomain。您可以做的是创建一个新的AppDomain(AppDomain.CreateDomain(...)),将程序集加载到此appdomain中以进行处理,然后在需要时卸载AppDomain。卸载AppDomain时,将卸载所有已加载的程序集。 (请参阅参考资料) 要调用垃圾收集器,您可以使用
GC.Collect(); // collects all unused memory
GC.WaitForPendingFinalizers(); // wait until GC has finished its work
GC.Collect();
GC在后台线程中调用终结器,这就是为什么必须等待并再次调用Collect()以确保删除了所有内容的原因。     
        您可以使用其他AppDomain吗?
AppDomain dom = AppDomain.CreateDomain(\"some\");     
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = pathToAssembly;
Assembly assembly = dom.Load(assemblyName);
Type [] types = assembly.GetTypes();
AppDomain.Unload(dom);
    
        可以将
Load
File.ReadAllBytes()
一起使用,而不是使用
LoadFrom()
LoadFile()
。这样,它将不使用汇编文件,而是将其读取并使用读取的数据。 您的代码将如下所示
Assembly assem = Assembly.Load(File.ReadAllBytes(filePath));
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;
从这里开始,除非文件包含的所有域都被卸载,否则我们无法卸载文件。 希望这可以帮助。:)     
        您无法从当前AppDomain卸载程序集。但是您可以创建新的AppDomain,将程序集加载到其中,在新的AppDomain中执行一些代码,然后将其卸载。检查以下链接:MSDN     
         如果只想加载初始程序集而没有任何从属程序集,则可以在AppDomain中使用ѭ9and,然后在完成后卸载AppDomain。 创建一个加载程序类以加载和使用程序集:
class Loader : MarshalByRefObject
{
    public void Load(string file)
    {
        var assembly = Assembly.LoadFile(file);
        // Do stuff with the assembly.
    }
}
在单独的应用程序域中运行加载程序,如下所示:
var domain = AppDomain.CreateDomain(nameof(Loader), AppDomain.CurrentDomain.Evidence, new AppDomainSetup { ApplicationBase = Path.GetDirectoryName(typeof(Loader).Assembly.Location) });
try {
    var loader = (Loader)domain.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName);
    loader.Load(myFile);
} finally {
    AppDomain.Unload(domain);
}
    
        遗憾的是,无法卸载程序集,此外-如果您使用appdomains-它将阻止您与主应用程序的api /程序集进行通信。 关于问题的最佳描述可以在这里找到: 脚本托管指南 http://www.csscript.net/help/Scr​​ipt_hosting_guideline_.html 如果您想运行C#代码而不与您的主应用程序进行通信-那么最好的方法是集成C#脚本API: https://github.com/oleg-shilo/cs-script/tree/master/Source/deployment/samples/Hosting/Legacy%20Samples/CodeDOM/Modifying%20script%20without%20restart 对于集成,您将需要以下软件包: C#脚本: http://www.csscript.net/CurrentRelease.html Visual Studio扩展: https://marketplace.visualstudio.com/items?itemName=oleg-shilo.cs-script 但是,如果您想从C#脚本与应用程序进行通信-当时只能使用具有不断变化的程序集名称的同一个appDomain-但不幸的是,这会占用ram和磁盘空间。 代码示例如何完成-可在此处找到: https://github.com/tapika/cppscriptcore CsScriptHotReload.sln 这是演示视频: https://drive.google.com/open?id=1jOECJj0_UPNdllwF4GWb5OMybWPc0PUV     

要回复问题请先登录注册