在我的公司中,发布Excel Interop Objects的常用方法是使用IDisposable,方法如下:
Public Sub Dispose() Implements IDisposable.Dispose
If Not bolDisposed Then
Finalize()
System.GC.SuppressFinalize(Me)
End If
End Sub
Protected Overrides Sub Finalize()
_xlApp = Nothing
bolDisposed = True
MyBase.Finalize()
End Sub
Run Code Online (Sandbox Code Playgroud)
在IDisposable
构造函数中以下列方式创建的位置:
Try
_xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)
Catch e As Exception
_xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
End Try
Run Code Online (Sandbox Code Playgroud)
并且客户端使用_xlApp
执行有关excel互操作对象的代码.
我们完全避免使用双点规则.现在我开始研究如何重新发布(Excel)互操作对象以及我发现的几乎所有关于它的讨论如何正确清理excel互操作对象或释放Excel对象主要使用Marshal.ReleaseComObject(),它们都没有使用IDisposable接口.
我的问题是:使用IDisposable Interace释放excel互操作对象有什么缺点吗?如果是这样,这些不利因素是什么.
Marshal.ReleaseComObject
在 Outlook 中与 MailItems 交互时使用的重要性是什么?
我参考了在https://docs.microsoft.com/en-us/visualstudio/vsto/walkthrough-creating-your-first-vsto-add-in-for-outlook?view创建 C# VSTO Outlook 插件的演练 =vs-2019
他们有一个修改现有选定邮件项目主题和正文的示例。
void Inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
{
Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem;
if (mailItem != null)
{
if (mailItem.EntryID == null)
{
mailItem.Subject = "This text was added by using code";
mailItem.Body = "This text was added by using code";
}
}
}
Run Code Online (Sandbox Code Playgroud)
该示例结束时没有提及使用 释放邮件项目对象Marshal.ReleaseComObject
。
但在https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.releasecomobject?view=netframework-4.8的 .Net API 参考中,他们提到:
您应该使用此方法及时或在必须以特定顺序释放对象时释放包含对资源的引用的基础 COM 对象。
因此,如果我们未能在我们引用的 MailItem 上使用 Marshal.ReleaseComObject,显然会有一些后果?
是否存在不使用 Marshal.ReleaseComObject 会导致问题的特定用例?
谢谢