Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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# 在C中发布PowerPoint互操作Com类成员实例#_C#_Com_Powerpoint_Office Interop_Dispose - Fatal编程技术网

C# 在C中发布PowerPoint互操作Com类成员实例#

C# 在C中发布PowerPoint互操作Com类成员实例#,c#,com,powerpoint,office-interop,dispose,C#,Com,Powerpoint,Office Interop,Dispose,我为Power point创建了一个简单的加载项,下面是代码 pp.Application ppApplication = new pp.Application(); private void Ribbon1_Load(object sender, RibbonUIEventArgs e) { ppApplication.PresentationOpen += new pp.EApplication_PresentationOpenEventHandler(ppApplication_

我为Power point创建了一个简单的加载项,下面是代码

pp.Application ppApplication = new pp.Application();
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
     ppApplication.PresentationOpen += new pp.EApplication_PresentationOpenEventHandler(ppApplication_PresentationOpen);
     ppApplication.PresentationClose += new pp.EApplication_PresentationCloseEventHandler(ppApplication_PresentationClose);
}
void ppApplication_PresentationOpen(pp.Presentation Pres)
{          
}
void ppApplication_PresentationClose(pp.Presentation Pres)
{
      GC.Collect();
      GC.WaitForPendingFinalizers();
       Marshal.FinalReleaseComObject(ppApplication);  
}

如果ppApplication是全局应用程序,Power point永远不会关闭。我认为全局com对象不会以这种方式释放。我该怎么办?

您应该应用Dispose/Finalize模式以正确释放非托管资源。这将保证一旦您的类被释放,所有非托管类成员(不是全局变量)都将被释放。 看


根据这篇文章中的建议

你应该打电话

pp.Application ppApplication = new pp.Application();
带内加载

此外,COM实例化和发布也是不对称的——在初始化类时实例化(即变量声明中的a=new()),但在关闭表示时发布。关闭演示文稿与关闭应用程序不同-功能区可能仍然可用,这会让您感到不适

最后一点是,您永远不会取消挂接到COM对象中的事件,至少您应该这样做

ppApplication.PresentationOpen -= new pp.EApplication_PresentationOpenEventHandler(ppApplication_PresentationOpen);
     ppApplication.PresentationClose -= new pp.EApplication_PresentationCloseEventHandler(ppApplication_PresentationClose);

要取消分配事件处理程序,否则您将有一些不死引用。

为什么要在PowerPoint加载项中使用
new pp.Application()
?您应该有一个
this.Application
成员。此外,C#没有“全局”变量,这是什么意思?您在ppApplication上的事件处理程序可能正在创建一个阻止发布ppApplication的依赖项。当您访问PresentationClosed事件时,请尝试删除钩住的事件处理程序。@codeCaster我实际上对我为正确处理互操作对象提供的示例的正确性的评论感兴趣。也许有人可以对这种方法发表一些评论,因为对此有很多意见。
pp.Application ppApplication = new pp.Application();
ppApplication.PresentationOpen -= new pp.EApplication_PresentationOpenEventHandler(ppApplication_PresentationOpen);
     ppApplication.PresentationClose -= new pp.EApplication_PresentationCloseEventHandler(ppApplication_PresentationClose);