C#编程:非.net控件WindowsMediaPlayer的使用与问题解决

需积分: 10 3 下载量 201 浏览量 更新于2024-07-25 收藏 872KB DOC 举报
本文主要讨论的是在C#中使用Windows Media Player(WMP)控件的挑战和细节。首先,作者提到了在.NET环境中引入非.NET控件的过程,如WMP控件,需要通过Visual Studio (VS) 自动调用AxImp.exe工具将原始DLL或OCX转换为AxHost包装的程序集,生成AxInterop.WMPLib.dll和Interop.WMPLib.dll文件,以便在C#项目中使用。 问题的核心在于如何正确地在C#中实例化和使用这种非可视化控件。作者指出,直接在窗体的构造函数中new一个AxWindowsMediaPlayer实例并试图立即使用它,可能会导致`System.Windows.Forms.AxHost+InvalidActiveXStateException`异常。这是因为非可视化的控件实例需要被添加到可视化的容器(如窗体的Controls集合)中才能正常工作。如果代码写在窗体的Load或Load之后的事件中,并确保窗体被显示,就能避免这个问题。 作者通过实验得出结论,非可视化的AxWindowsMediaPlayer实例不能在非可视化类中创建,必须将其添加到可视化的控件容器中才能确保控件的初始化和正确执行。例如,将实例化和设置URL的代码放在窗体的Load事件中,如: ```csharp private void Form1_Load(object sender, EventArgs e) { AxWMPLib.AxWindowsMediaPlayer wmp = new AxWMPLib.AxWindowsMediaPlayer(); this.Controls.Add(wmp); wmp.URL = "约定.mp3"; wmp.Ctlcontrols.play(); } ``` 此外,作者还观察到,在拖拽控件到窗体后,VS自动生成的代码与手动创建实例的代码存在差异,主要体现在一对圆括号的缺失,即`((System.ComponentModel.ISupportInitialize(wmp)).BeginInit()`和`((System.ComponentModel.ISupportInitialize(wmp)).EndInit())`,这是为了正确处理控件的布局和释放资源所必需的。 使用非.NET的Windows Media Player控件在C#中需要特别注意控件的生命周期管理和可视化容器的关联,尤其是在初始化过程中,遵循正确的事件处理和控件管理方式可以避免常见问题。