C# NAudio 库,无法在组合框中列出编解码器

C# NAudio library, can't list codecs in combo box

我试图在组合框中列出所有可能用于音频压缩的编解码器。 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;

因为值不能为空。

下面是我的解决方案资源管理器的图像,您可以在其中看到我添加的所有编解码器以及组合框中应显示的内容:

您复制的代码正在使用 Microsoft Extensibility Framework,这就是您在顶部显示 [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