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给了你太多的束缚。相关的: