Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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
C# (最终)ReleaseComObject不';t按COM对象释放文件锁_C#_Vb.net - Fatal编程技术网

C# (最终)ReleaseComObject不';t按COM对象释放文件锁

C# (最终)ReleaseComObject不';t按COM对象释放文件锁,c#,vb.net,C#,Vb.net,使用以下代码时: Dim modiDocument As New MODI.Document modiDocument.Create(TifFile) modiDocument.Close(False) 然后TifFile没有被锁定,我可以做一些事情,比如删除它(IO.File.delete) 但是,当我枚举图像时,文件将被锁定: Dim modiDocument As New MODI.Document modiDocument.Create(TifFile) For Each modiIm

使用以下代码时:

Dim modiDocument As New MODI.Document
modiDocument.Create(TifFile)
modiDocument.Close(False)
然后TifFile没有被锁定,我可以做一些事情,比如删除它(IO.File.delete)

但是,当我枚举图像时,文件将被锁定:

Dim modiDocument As New MODI.Document
modiDocument.Create(TifFile)
For Each modiImage In modiDocument.Images
  'Doesn't matter if I enter code here or not.
Next
modiDocument.Close(False)
现在文件将被锁定

我尝试了一切(我认为)来解决这个问题,比如:

Dim modiDocument As New MODI.Document
modiDocument.Create(TifFile)
For Each modiImage In modiDocument.Images
  Marshal.ReleaseComObject(modiImage)
Next
Marshal.ReleaseComObject(modiImage)
modiDocument.Close(False)
Marshal.ReleaseComObject(modiDocument)
是的,我也试过FinalEleaseComObject

到目前为止,没有运气

我怎样才能解决这个问题


注意:这里的示例是用VB编写的。我也知道C#,所以用哪种语言提供代码示例并不重要。

你需要释放你实例化的每个COM对象,很容易错过一个。例如,您错过了
修改文档.图像

以下内容可能会有所帮助:

modiDocument.Create(TifFile)
var images = modiDocument.Images
For Each modiImage In images
    ...
Next
...
Marshal.ReleaseComObject(images)

如果在For Each循环中为实例化其他COM对象添加代码,则也需要清理这些对象。

FinalReleaseComObject
在循环中调用
ReleaseComObject
,直到释放为止,调用次数可能超过3次。因此,您应该尝试
FinalReleaseComObject
我尝试了没有结果的枚举器对象,您无法看到它,可能是IEnumVariant。这就是为什么尝试实现手动内存管理是个糟糕的主意,VB.NET和C#中的语法sugar给了你太多的束缚。相关的: