.net 释放通过“CreateObject”实例化的COM DLL上的文件锁`
我有一个.Net 4 WinForms应用程序,它生成一个DLL,对生成的DLL调用.net 释放通过“CreateObject”实例化的COM DLL上的文件锁`,.net,vb.net,com,.net,Vb.net,Com,我有一个.Net 4 WinForms应用程序,它生成一个DLL,对生成的DLL调用CreateObject,然后调用DLL包含的几个方法之一。DLL最终由一个单独的应用程序使用。此WinForms应用程序仅用于生成和测试DLL,因此它可以多次生成DLL 问题在于在DLL上调用CreateObject会将文件锁定到进程。下次生成DLL时,如果不完全关闭应用程序并再次启动它,它将无法覆盖磁盘上以前的DLL文件 我尝试了Marshal.ReleaseComObject,在一个单独的AppDomain
CreateObject
,然后调用DLL包含的几个方法之一。DLL最终由一个单独的应用程序使用。此WinForms应用程序仅用于生成和测试DLL,因此它可以多次生成DLL
问题在于在DLL上调用CreateObject
会将文件锁定到进程。下次生成DLL时,如果不完全关闭应用程序并再次启动它,它将无法覆盖磁盘上以前的DLL文件
我尝试了Marshal.ReleaseComObject
,在一个单独的AppDomain中执行CreateObject
,甚至通过CreateObject
将保存COM对象的变量设置为另一个COM对象,手动调用GC.Collect()
和一系列其他操作,但都无法解锁文件
代码流基本上是(简化和通用名称等):
相当标准的用法。所以我的问题是:有没有一种方法可以在不终止进程的情况下释放通过CreateObject
实例化的COM DLL上的文件锁
注:这是本手册的延续。我现在已经注册了DLL,但没有锁定文件,但现在的问题是CreateObject调用而不是DLL注册。您应该这样做,以便释放COM对象,然后是p/Invoke,以便卸载通过COM加载且不再使用的DLL。每当我调用
Marshal.ReleaseComObject(foo)
我得到一个异常对象的类型必须是\uuuuComObject或从\uuuuComObject派生。
。它似乎认为这不是一个真正的COM类,尽管它拥有所有的ComClass
和ComVisible
装饰程序。在watch窗口中查看它,它确实给出了一种“Bar.Foo”类型,而不是“ComObject”。我搞砸了吗?这可能是时间问题吗?设置foo=Nothing
后,您能等一会儿,然后尝试删除该文件吗。可能需要一些说明才能真正卸下锁。您可能需要再次尝试您的GC.Collect
和ReleaseComObject
,我认为这不是由于时间原因。在foo=Nothing
和文件之间,我有一些额外的说明。在故障排除过程中,在不同的地方删除,但没有任何帮助。我一开始也认为,处理速度太快,文件无法正常解锁,但在本例中,这似乎不是问题所在。
...
' 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")
...