释放已通过`CreateObject`实例化的COM DLL上的文件锁

时间:2011-12-21 23:55:31

标签: .net vb.net com

我有一个生成DLL的.Net 4 WinForms应用程序,在生成的DLL上调用CreateObject,然后调用DLL包含的几种方法之一。 DLL最终由一个单独的应用程序使用。这个WinForms应用程序只是生成并测试DLL,因此它可以多次生成DLL。

问题在于,在DLL上调用CreateObject会将文件锁定到进程。下次生成DLL时,如果没有完全关闭应用程序并再次启动它,它就无法覆盖磁盘上的先前DLL文件。

我已尝试Marshal.ReleaseComObject,在单独的AppDomain中执行CreateObject,甚至通过CreateObject将包含COM对象的变量设置为不同的COM对象,手动调用{{1}和其他许多东西都没有导致解锁文件。

代码流基本上是(简化和通用名称等):

GC.Collect()

非常标准的用法。所以我的问题是:有没有办法在已经通过... ' Compile and generate DLL that is COM enabled and works fine ... Dim foo As Object = CreateObject("Bar.Foo") foo.callMethod() ... ' Succeeds or fails then continues ... ... ' Clean up and remove the generated DLL foo = Nothing File.Delete("C:\myassembly.dll") ... 实例化的COM DLL上释放文件锁而不会终止进程?

注意:这是this original issue的延续。我现在有DLL注册而没有锁定文件,但现在问题是CreateObject调用而不是DLL注册。

1 个答案:

答案 0 :(得分:1)

你应该做Marshal.ReleaseComObject(foo)以释放COM对象,然后是P / Invoke CoFreeUnusedLibraries,以便卸载那些通过COM加载并且不再使用的DLL。