2016-09-05 2 views
0

Ich bin ein Anfänger mit Programmierung so nüchtern mit mir. Ich versuche, alle für die Audiokomprimierung möglichen Codecs in einem Kombinationsfeld aufzulisten. NAudio hat Quellcode und eine Demo-Anwendung, die ich in meiner Formularanwendung nachzuahmen versuche. Wenn jemand mir helfen kann, ist ihr Quellcode here.C# NAudio Bibliothek, Cant List Codecs in Combo-Box

So haben sie etwa 7 andere .cs-Dateien in ihrem Projekt, die den Codecs ähnelt sie verwenden, so dass ich sie alle in mein Projekt kopiert. Ich kopierte dann alle relevanten Code für die Auflistung in einer Combo-Box. Keine Fehler so weit oder irgendetwas so ich es laufen lasse und es stoppt, da der Wert von jedem Codec Null zu sein scheint (bekannt gegeben unter dem Code).

Hier ist mein Code so weit:

  var sorted = from codec in codecs 
        where codec.IsAvailable 
        orderby codec.BitsPerSecond ascending 
        select codec; 

als der Wert null sein kann:

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; 
     } 
    } 
} 
} 

aber dann, wenn ich den Code ausführen, hier hält.

Unten ist ein Bild meiner Lösung Explorer, wo Sie alle Codecs i hinzugefügt sehen kann und was in dem Kombinationsfeld werden soll gezeigt:

solution explorer

Wieder mit mir bitte entblößen als Anfänger im, , alle Hilfe wird geschätzt

Antwort

1

Der Code, den Sie kopierten, verwendet das Microsoft Extensibility Framework, weshalb Sie [ImportMany(typeof(INetworkChatCodec))] an der Spitze haben. Wenn Sie auch diese Codec-Dateien von NAudio kopiert haben, enthalten sie alle etwas wie [Export(typeof(INetworkChatCodec))] in ihnen.

MEF wird dann Ihr Programm für alle Instanzen von INetworkChatCodec scannen, eine Instanz von ihnen erstellen und die Liste in Codecs speichern. Aber Sie müssen es initialisieren.

Der Code initialisiert es für die Demo in der Startcode gefunden wird, aber es ist ziemlich Standard MEF Zeug:

var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); 
var exportFactoryProvider = new ExportFactoryProvider(); 
var container = new CompositionContainer(catalog, exportFactoryProvider); 
exportFactoryProvider.SourceProvider = container; 

Beachten Sie jedoch, dass diese Demo für .NET 3.5 geschrieben wurde; Es enthält lokale Verweise auf einige MEF-Bits (diese befinden sich im Ordner Lib\MEF), die Sie benötigen, um ExportFactoryProvider zu verwenden.

IIRC, in .NET 4.5, die System.ComponentModel.Composition Bibliothek ist eingebaut, aber Sie würden ExportFactory<T> statt ExportFactoryProvider verwenden, um eine ImportMany

zu tun