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,然后删除文件。
我正在使用 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,然后删除文件。