2016-10-29 2 views
-4

Я пытаюсь загрузить сборку, System.Speech, через отражение, так что я могу использовать метод SpeakAsync для чтения вслух некоторого текста.C# как загрузить сборку с отражением

Я написал:

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

Но получаю ошибку

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

Это выглядит как дубликат: http://stackoverflow.com/questions/14479074/c-sharp-reflection-load-assembly-and-invoke-a-method-if-it-exists Может быть, это часть проблемы тоже: http://stackoverflow.com/questions/6049332/i-cant-find-system-speech – Marksl

+0

@Marksl Я посмотрел на этот первый вопрос, чтобы получить код, который у меня есть на данный момент, но поскольку вы можете см. выше, он не работает, поэтому ... – theonlygusti

+0

Я клянусь, что есть кто-то, кто действительно меня ненавидит, и просто опускает все мои вопросы. Серьезно, что в этом плохого? – theonlygusti

ответ

0

Ваш код содержит ошибку, вы не можете работать с классом, если указано неправильное пространство имен (ни с помощью отражения, ни без него)

Здесь используется некорректное пространство имен (именно поэтому вы получили исключение для ссылки):

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

Вот пример правильных пространств имен:

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

Update1: Еще одно замечание. invoke возвращает приглашение, и вы не должны выйти из программы во время работы асинхронного метода (конечно, только если вы действительно хотите прослушать речь до конца). Я добавил несколько строк кода, чтобы ждать, пока Speach не будет закончено:

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

Убедитесь, что правильный языковой пакет. MSDN

Update 3 Если вы используете Mono, постарайтесь убедиться, что эта функция должна работать на Mono. Я думаю, что есть некоторые проблемы с реализацией Mono.

+0

сделал это, получил новую ошибку: http://pastebin.com/iPdQyPQU – theonlygusti

+0

@theonlygusti посмотреть в update2 – burzhuy

+0

Не думаю, что мне нужно будет дождаться завершения асинхронного метода, почему это асинхронно, если мне нужно ждать, пока он закончит? Для меня это не имеет смысла. – theonlygusti