我试图在组合框中列出可能用于音频压缩的所有编解码器。 NAudio有源代码和演示应用程序,我试图在我的表单应用程序中模拟。如果有人可以帮助我,他们的源代码是here.
因此他们在项目中有大约7个其他.cs文件,类似于他们使用的编解码器,所以我将它们全部复制到我的项目中。然后我复制了所有(从我看到的)相关代码,以便在组合框中列出它们。到目前为止没有错误或其他任何错误,所以我运行它并且它停止,因为每个编解码器的值似乎为空(在代码下方发布)。
到目前为止,这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using NAudio.Wave;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.ComponentModel.Composition;
using NAudioDemo.NetworkChatDemo;
namespace NAudio_VoIP_UDP
{
public partial class Form1 : Form
{
[ImportMany(typeof(INetworkChatCodec))]
public IEnumerable<INetworkChatCodec> Codecs { get; set; }
public Form1()
{
InitializeComponent();
PopulateCodecsCombo(Codecs);
}
private void PopulateCodecsCombo(IEnumerable<INetworkChatCodec> codecs)
{
var sorted = from codec in codecs
where codec.IsAvailable
orderby codec.BitsPerSecond ascending
select codec;
foreach (var codec in sorted)
{
string bitRate = codec.BitsPerSecond == -1 ? "VBR" : String.Format("{0:0.#}kbps", codec.BitsPerSecond / 1000.0);
string text = String.Format("{0} ({1})", codec.Name, bitRate);
comboBoxCodecs.Items.Add(new CodecComboItem { Text = text, Codec = codec });
}
comboBoxCodecs.SelectedIndex = 0;
}
class CodecComboItem
{
public string Text { get; set; }
public INetworkChatCodec Codec { get; set; }
public override string ToString()
{
return Text;
}
}
}
}
但是当我运行代码时,它会停在这里:
var sorted = from codec in codecs
where codec.IsAvailable
orderby codec.BitsPerSecond ascending
select codec;
因为值不能为空。
下面是我的解决方案资源管理器的图片,您可以在其中看到我添加的所有编解码器以及应该在组合框中显示的内容:
答案 0 :(得分:1)
您复制的代码使用的是Microsoft扩展性框架,这就是您在顶部有[ImportMany(typeof(INetworkChatCodec))]
的原因。如果您还从NAudio复制了这些编解码器文件,它们都包含[Export(typeof(INetworkChatCodec))]
之类的内容。
MEF将扫描您的程序以查找INetworkChatCodec
的所有实例,创建它们的实例,并将列表存储在Codecs
中。但是你需要初始化它。
初始化它的代码可以在该演示的启动代码中找到,但它是非常标准的MEF内容:
var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var exportFactoryProvider = new ExportFactoryProvider();
var container = new CompositionContainer(catalog, exportFactoryProvider);
exportFactoryProvider.SourceProvider = container;
但请注意,此演示是为.NET 3.5编写的;它包括对某些MEF位的本地引用(它们位于Lib\MEF
文件夹中),为了使用ExportFactoryProvider
,您需要这些位。
IIRC,在.NET 4.5中,System.ComponentModel.Composition
库是内置的,但您可以使用ExportFactory<T>
代替ExportFactoryProvider
来执行ImportMany