我正在尝试通过反射加载程序集System.Speech
,以便我可以使用SpeakAsync
方法大声朗读某些文本。
我写了这个:
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 :(得分:0)
您的代码包含错误,如果您指定了错误的命名空间(既不通过反射也不通过反射),您就无法使用类
您在此处使用了错误的命名空间(这就是您收到空引用异常的原因):
System.Type type = assembly.GetType("System.Speech.SpeechSynthesizer");//type == null
以下是正确名称空间的示例:
System.Type type = assembly.GetType("System.Speech.Synthesis.SpeechSynthesizer");
<强> UPDATE1:强>
另一个说明。 invoke
返回一个提示,当异步方法工作时你不应该退出程序(当然,只有当你真的想听到语音结束时)。我在您的代码中添加了几行代码,等待语音完成:
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();
}
}
}
更新2
确保您拥有正确的语言包。 MSDN
更新3
如果您使用Mono,请尝试确保此功能适用于Mono
。我认为Mono
实现存在一些问题。