c# Ninject - 解除绑定和释放

c# Ninject - Unbinding and releasing

我正在使用 ninject 和以下代码来绑定和加载依赖项:

kernel.Bind(x =>
   x.FromAssembliesInPath(folder)
      .SelectAllClasses()
      .InheritedFrom<ISample>()
      .BindAllInterfaces()
      .Configure(binding => binding.InSingletonScope()));

var samples = kernel.GetAll<ISample>().ToList();

这工作正常,依赖项加载成功。

然后我有一个单独的例程来卸载依赖项,并将它们完全清除(从磁盘上删除文件)。这是相关代码:

foreach (var s in samples)
{
    s.Dispose();   // ISample Implements IDisposable
}

kernel.Unbind<ISample>();
samples.Clear();
samples = null;

// Delete the folder which contains the ISample assemblies
Directory.Delete(folder, true);

Directory.Delete() 导致 UnauthorizedAccessException(对路径的访问被拒绝。)

我一定是漏掉了完全释放动态加载程序集的步骤。我需要帮助来确定该步骤是什么,以及需要哪些额外的代码才能完全释放引用的程序集,以便它们可以安全地从磁盘中删除。

你要的不是Ninject的限制,而是.NET的限制。您不能从 AppDomain 中卸载程序集。 AppDomain 将始终保持引用加载的程序集,并且在卸载 AppDomain 之前不能从磁盘中删除文件。

所以您应该做的是从主应用程序中启动第二个 AppDomain 并从那里加载程序集。完成后,您可以从主域卸载 AppDomain,然后删除文件。