我正在编写一个小型的C Sharp程序,使用iTunes Windows COM API与iTunes进行连接。 我的程序必须在iTunes启动之前和iTunesclosures后运行。 我希望它能够在使用OnQuittingEventclosuresiTunes时进行检测。
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!"); }
然而,当我的C程序正在运行时,当我closuresiTunes时,我收到一条警告消息:“一个或多个应用程序正在使用iTunes脚本界面”,然后在iTunesclosures之前进行20秒倒计时。
我的问题:我可以使用iTunes的Windows COM OnQuittingEvent事件处理程序来sortingiTunes应用程序中的iTunesApp对象引用,在我closuresiTunes应用程序的时候,因此没有在屏幕上显示警告消息。 有没有办法只是压制这个警告信息?
在这里问了一个类似的问题: closures应用程序时如何禁止“此应用程序中仍有活动的COM对象”错误? 但是代码是C ++而不是C Sharp。
谢谢。
要阻止对话框,您需要减少运行时可调用包装程序引用计数,然后强制收集您的iTunesAppClass引用。 有关更多详细信息,请参阅用户Bonj 在这里发表 。 与他们的例子不同,我发现没有必要在收集之前将iTunesAppClass引用设置为null。 可能依赖于你的实现。 我也发现我不必在一个循环中减少RCW,因为我只有一个COM对象引用。 这是一个在我的应用程序中工作的例子:
var app = new iTunesLib.iTunesAppClass(); // do stuff System.Runtime.InteropServices.Marshal.ReleaseComObject(app); System.GC.Collect();
由于我对贾森的回答没有足够的评价来评论,所以我会再发一个帖子。
我不知道为什么他的回答是被拒绝的,但是效果很好。 我明白这原本是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。