2016-09-05 3 views
0

im un débutant avec la programmation si nue avec moi. Im essayant de lister tous les codecs possibles pour la compression audio dans une zone de liste déroulante. NAudio a du code source et une application de démonstration qui im ​​im essayant d'émuler dans mon application de formulaire. Si quelqu'un peut m'aider, leur code source est here.Bibliothèque C# NAudio, codecs de liste Cant dans la zone de liste déroulante

Donc, ils ont environ 7 autres fichiers .cs dans leur projet qui ressemble aux codecs qu'ils utilisent donc je les ai tous copiés dans mon projet. J'ai alors copié tout le code pertinent (de ce que je vois) pour les énumérer dans une zone de liste déroulante. Aucune erreur jusqu'à présent ou quoi que ce soit donc je l'exécute et il s'arrête car la valeur de chaque codec semble être nulle (posté sous le code).

Voici mon code à ce jour:

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

mais quand je lance le code, il arrête ici:

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

que la valeur ne peut être nulle.

est ci-dessous une image de mon explorateur de solution où vous pouvez voir tous les codecs i ajoutés et ce qui doit être indiqué dans la zone de liste déroulante:

solution explorer

Encore une fois, s'il vous plaît nu avec moi comme im un débutant , toute l'aide est appriciée

Répondre

1

Le code que vous avez copié utilise Microsoft Extensibility Framework, c'est pourquoi vous avez [ImportMany(typeof(INetworkChatCodec))] en haut. Si vous avez également copié ces fichiers de codecs de NAudio, ils contiennent tous quelque chose comme [Export(typeof(INetworkChatCodec))]. MEF va ensuite scanner votre programme pour toutes les instances de INetworkChatCodec, en créer une instance et enregistrer la liste dans Codecs. Mais vous devez l'initialiser.

Le code pour l'initialiser se trouve dans le code de démarrage pour cette démo, mais il est assez standard des choses MEF:

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

Notez, cependant, que cette démo a été écrit pour .NET 3.5; il inclut des références locales à certains bits MEF (ils se trouvent dans le dossier Lib\MEF), dont vous aurez besoin pour utiliser ExportFactoryProvider.

IIRC, dans 4,5 .NET, la bibliothèque System.ComponentModel.Composition est construite, mais vous utiliseriez ExportFactory<T> au lieu de ExportFactoryProvider pour faire une ImportMany