我不太擅长管理 COM 对象。我已经阅读了相当多的内容,但我无法完全理解当您有两个引用指向一个 COM 对象并释放其中一个时会发生什么。考虑以下[半]假设:
我在 C# 中为 Excel 工作簿创建了一个基本的包装类:
using ExcelInterop = Microsoft.Office.Interop.Excel;
...
public class WorkbookWrapper : IDisposable
{
protected internal ExcelInterop.Workbook _wb;
public WorkbookWrapper(ExcelInterop.Workbook workbook)
{
_wb = workbook;
}
public WorkbookWrapper(WorkbookWrapper workbookWrapper)
{
_wb = workbookWrapper._wb;
}
#region IDisposable
// basic Dispose function which releases _wb COM Object (omitted to shorten post length)
#endregion
...
}
对于我正在进行的一个特定项目,我发现有必要将一些附加信息附加到WorkbookWrapper
对象上,因此我对其进行了扩展:
class LinkingWorkbookWrapper : WorkbookWrapper
{
internal string workbookGUID = null;
internal LinkingWorkbookWrapper(WorkbookWrapper workbookWrapper, string GUID) : base(workbook)
{
workbookGUID = GUID;
}
...
}
这个特定的类使用WorkbookWrapper(WorkbookWrapper)
构造函数来存储对互操作工作簿的新引用,这在使用如下函数时突然出现问题:
public static void ProcessAllCharts(WorkbookWrapper wbw)
{
LinkingWorkbookWrapper lwbw = null;
if(wbw is LinkingWorkbookWrapper)
lwbw = (LinkingWorkbookWrapper)wbw;
else
lwbw = new LinkingWorkbookWrapper(wbw, GenerateGUID());
//... do stuff ...
}
现在假设该函数必须接受正常WorkbookWrapper
的 s。 什么时候处理合适lwbw
? 如果我在结尾处这样做,ProcessAllCharts
我可能会将原始中引用的 COM 对象wbw
与其 RCW 分开;另一方面,如果我不处理lwbw
,我会冒着将 COM 对象的引用留在以太中的风险。