2016-10-29 4 views
-4

Ich versuche eine Baugruppe, System.Speech, über Reflektion zu laden, so dass ich die SpeakAsync Methode verwenden kann, um etwas Text vorzulesen. dieseC# Wie man eine Baugruppe mit Reflektion lädt

schrieb ich:

System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom("System.Speech.dll"); 
System.Type type = assembly.GetType("System.Speech.SpeechSynthesizer"); 
var methodinfo = type.GetMethod("SpeakAsync", new System.Type[] {typeof(string)}); 
if (methodinfo == null) throw new System.Exception("No methodinfo."); 

object[] speechparameters = new object[1]; 
speechparameters[0] = GetVerbatim(text); // returns something like "+100" 

var o = System.Activator.CreateInstance(type); 
methodinfo.Invoke(o, speechparameters); 

Aber den Fehler

System.NullReferenceException: Object reference not set to an instance of an object 
+0

Das sieht wie ein Duplikat: http://stackoverflow.com/questions/14479074/c-sharp-reflection-load-assembly-and-invoke-a-method-if-it-exists Vielleicht ist Teil des Problems auch: http://stackoverflow.com/questions/6049332/i-cant-find-system-speech – Marksl

+0

@Marksl Ich schaute auf diese erste Frage, um den Code zu bekommen, den ich im Moment habe, aber wie du kannst siehe oben, es funktioniert nicht, also ... – theonlygusti

+0

Ich schwöre, dass es jemanden gibt, der mich wirklich hasst und alle meine Fragen einfach ablehnt. Im Ernst, was ist daran falsch? – theonlygusti

Antwort

0

Ihr Code Fehler enthält, können Sie nicht mit der Klasse arbeiten können, wenn Sie ein falschen Namensraum angegeben (weder durch Reflexion, ohne es noch)

Sie verwenden hier falschen Namespace (deshalb Null-Referenz Ausnahme erhalten):

Hier
System.Type type = assembly.GetType("System.Speech.SpeechSynthesizer");//type == null 

ist Beispiel für die korrekte Namensräumen:

System.Type type = assembly.GetType("System.Speech.Synthesis.SpeechSynthesizer"); 

Update1: Noch ein Hinweis. invoke gibt eine Eingabeaufforderung zurück, und Sie sollten das Programm nicht beenden, während die asynchrone Methode funktioniert (natürlich nur, wenn Sie wirklich Rede bis zum Ende hören wollen). Ich habe einige Zeilen Code zu warten, bis Speach fertig werden:

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var assembly = Assembly.LoadFrom("System.Speech.dll"); 
     var type = assembly.GetType("System.Speech.Synthesis.SpeechSynthesizer"); 
     var methodinfo = type.GetMethod("SpeakAsync", new[] {typeof(string)}); 
     if (methodinfo == null) throw new Exception("No methodinfo."); 

     var speechparameters = new object[1]; 
     speechparameters[0] = "+100"; // returns something like "+100" 

     var o = Activator.CreateInstance(type); 
     var prompt = (Prompt) methodinfo.Invoke(o, speechparameters); 

     while (!prompt.IsCompleted) 
     { 
      Task.Delay(500).Wait(); 
     } 
    } 
} 

Update 2

Stellen Sie sicher, die richtige Sprachpaket haben. MSDN

Update 3 Wenn Sie Mono verwenden, versuchen Sie sicher auf Mono Diese Funktion sollte Arbeiten zu machen, dass. Ich denke, es gibt einige Probleme mit Mono Realisierung.

+0

tat dies, bekam einen neuen Fehler: http://pastebin.com/iPdQyPQU – theonlygusti

+0

@theonlygusti Blick in update2 – burzhuy

+0

Ich glaube nicht, dass ich warten auf eine asynchrone Methode zu beenden, warum ist es asynchron, wenn ich muss warte bis es fertig ist? Das macht keinen Sinn für mich. – theonlygusti

Verwandte Themen