我有一个生成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注册。
答案 0 :(得分:1)
你应该做Marshal.ReleaseComObject(foo)
以释放COM对象,然后是P / Invoke CoFreeUnusedLibraries
,以便卸载那些通过COM加载并且不再使用的DLL。