C# 关闭Winform时取消引用DLL

C# 关闭Winform时取消引用DLL,c#,.net,winforms,vba,dll,C#,.net,Winforms,Vba,Dll,我有一个.NET表单,其中使用了多个用户控件,在用户控件内部引用了多个DLL。该应用程序是vba和.NET窗体的组合,我们通过COM接口从vba打开.NET窗体 问题是,当我关闭表单时,它不会取消释放/取消引用表单中使用的DLL,因为每当我再次打开表单时,它会不断增加MSACCESS.exe进程的大小。我试图调用GC.Collect和GC.WaitForPendingFinalizers()但没有解决问题 在关闭表单期间,如何取消引用这些DLL 在关闭表单期间,如何取消引用这些DLL 您不能卸载

我有一个.NET表单,其中使用了多个用户控件,在用户控件内部引用了多个DLL。该应用程序是vba和.NET窗体的组合,我们通过COM接口从vba打开.NET窗体

问题是,当我关闭表单时,它不会取消释放/取消引用表单中使用的DLL,因为每当我再次打开表单时,它会不断增加
MSACCESS.exe
进程的大小。我试图调用
GC.Collect
GC.WaitForPendingFinalizers()
但没有解决问题

在关闭表单期间,如何取消引用这些DLL

在关闭表单期间,如何取消引用这些DLL

您不能卸载加载到.NET
AppDomain
中的程序集,但它也只能加载一次->在“重新加载表单”时不会增加内存


我猜您的代码中有一些内存泄漏:您是否尝试过使用内存探查器将其固定下来?

听起来更像是在创建非托管对象,而不是在窗体关闭时释放它们


如果是这种情况,那么您需要跟踪非托管对象,并在OnFormClosed中释放它们。

这可能有点不合适。但是你试过看表单的OnFormClosed函数吗?你应该能够在引用dll或dll中的对象时处理杀死东西?在你的MSAccess代码中,你完成后是否
设置myNetCOMForm=Nothing
?如果你的.NET COM可见代码仍然有一个悬空的COM引用,很肯定
GC.Collect
不会有任何效果是的,我在退出函数时执行了form=nothing。我还重写了正在使用的所有控件上的Dispose方法“您无法卸载加载到.NET AppDomain中的程序集。”-我可能正在跟踪,但这是不正确的@MickyDuncan:我的说法是正确的:您可以卸载
AppDomain
,但不必卸载整个域,就可以卸载该域中的一个程序集->您不能仅卸载
AppDomain
。但是“如果需要卸载程序集,请为程序集创建一个单独的
AppDomain
”,这当然是对的……我想可以用两种方式来理解。无论如何,我们似乎都同意,我的朋友。我如何才能在窗体关闭时取消释放非托管对象。这取决于您如何创建它们。我需要查看代码来确定这一点。