生存期管理

外接程序模型的远程处理功能使得生存期管理复杂起来。 由于垃圾回收未对回收多个应用程序域中的对象提供足够的支持,因此外接程序模型提供了自己的生存期管理系统。 此管理系统使用一个“引用计数”系统和公共语言运行时的远程处理服务。

外接程序模型的生存期管理系统可以跨越多个应用程序域和独立进程,以确保对象、协定和外接程序已经释放并且它们的应用程序域已经卸载。 该系统通过在外接程序提供从宿主进行的调用时维护该外接程序的标记句柄 (ContractHandle) 来实现这一点。

生存期管理的实现

若要实现生存期管理,必须每当在“协定到视图”适配器中使用协定时获得一个生存期标记,然后在适配器完成使用协定时撤消该生存期标记。 如果在适配器中使用 ContractHandle 类,该类将完成上述操作。 如果管线传递自定义类型,则您必须在您实现的所有“协定到视图”适配器类中获得标记句柄。 有关“协定到视图”适配器的更多信息,请参见协定、视图和适配器

ContractHandle 类采用协定作为其构造函数。 下面的示例演示如何在宿主端适配器中设置生存期标记句柄。

重要说明重要事项

ContractHandle 对于生存期管理至关重要。如果无法保留对 ContractHandle 对象的引用,则垃圾回收功能会回收该对象,而管线会在程序不需要时关闭。这可能会导致难以诊断的错误,如 AppDomainUnloadedException。关闭是管线生存期中的正常阶段,因此生存期管理代码无法检测此情况是否为错误。

Private _contract As ICalc2Contract
Private _handle As ContractHandle

Public Sub New(ByVal contract As ICalc2Contract)
    _contract = contract
    _handle = New ContractHandle(contract)
End Sub
private CalculatorContracts.ICalc2Contract _contract;

private System.AddIn.Pipeline.ContractHandle _handle;

public CalculatorContractToViewHostAdapter(ICalc2Contract contract) {
    _contract = contract;
    _handle = new System.AddIn.Pipeline.ContractHandle(contract);
}

在获得标记句柄后,该系统处理所有生存期管理功能并且不需要进行额外编程。

在外接程序模型下,宿主和外接程序运行起来就好像它们自己的生存期管理由垃圾回收器控制一样。 其本地引用被释放,这使得任何远程引用被释放和收集。

外接程序的关闭

宿主应用程序可以通过调用 AddInController 类的 Shutdown 方法来关闭外接程序的应用程序域。

AddInController 类跟踪外接程序及其应用程序域以确保它们已经卸载。

请参见

概念

协定、视图和适配器

管线开发