Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 释放通过“CreateObject”实例化的COM DLL上的文件锁`_.net_Vb.net_Com - Fatal编程技术网

.net 释放通过“CreateObject”实例化的COM 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

我有一个.Net 4 WinForms应用程序,它生成一个DLL,对生成的DLL调用
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")
...