我正在编写一个小型的C Sharp程序,使用iTunes Windows COM api与iTunes连接。我的程序必须在iTunes启动之前和iTunes关闭之后运行。我想让它检测iTunes何时使用OnQuittingEvent关闭。
private void itunes_OnQuittingEvent()
{
// Remove any handlers from the iTunes COM object.
app.OnPlayerPlayEvent -= itunes_OnPlayerPlayEvent;
app.OnQuittingEvent -= itunes_OnQuittingEvent;
bniTunesRunning = false;
// Release the COM object.
app = null;
Console.WriteLine("iTunes Closing!");
}
然而,当我的程序运行时,当我关闭iTunes时,我收到一条警告消息:“一个或多个应用程序正在使用iTunes脚本界面”,然后在iTunes关闭之前进行20秒倒计时。
我的问题: 我是否可以使用iTunes Windows COM OnQuittingEvent事件处理程序在关闭iTunes应用程序时在我的C代码中取消实例化iTunesApp对象引用,从而没有在屏幕上显示该警告消息?有没有办法完全压制这条警告信息?
此处提出了类似的问题:How to suppress "There are still active COM objects in this application" error when closing application?但代码是C ++而不是C Sharp。
谢谢。
答案 0 :(得分:1)
要阻止对话框,您需要减少运行时可调用包装器引用计数,然后强制收集iTunesAppClass引用。有关详细信息,请参阅用户Bonj here发布的信息。与他们的示例不同,我发现在收集之前没有必要将iTunesAppClass引用设置为null。但是,可能取决于您的实施。我还发现我没有必要在循环中减少RCW,因为我只引用了一个COM对象。这是一个适用于我的应用程序的示例:
var app = new iTunesLib.iTunesAppClass();
// do stuff
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
System.GC.Collect();
答案 1 :(得分:0)
由于我没有足够的声誉对Jason的答案发表评论,我将再发一篇文章。
我不知道为什么他的回答被拒绝了,但是效果很好。我知道这最初是C#,但我只知道VB(我确定你可以翻译)。
Public Sub iTunesApplication_Dispose()
RemoveHandler iTunesApplication.OnPlayerPlayEvent, AddressOf Track_Played
Runtime.InteropServices.Marshal.ReleaseComObject(iTunesApplication)
iTunesApplication = Nothing
System.GC.Collect()
End Sub
如果没有他建议的这两行,我仍然会收到一个应用程序连接到脚本界面的通知(尽管我处理甚至关闭了我的程序)。当然,我不应该只是为了断开连接来关闭我的应用程序。
它不仅删除了通知,还解决了重新连接到iTunes的问题。正确释放COM对象让我无需重新启动iTunes即可无缝地禁用/启用程序的监听器。