c#如何用反射加载程序集



我正试图通过反射加载程序集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

您的代码包含错误,如果您指定了不正确的名称空间(无论是通过反射还是没有反射),您无法使用class

你在这里使用了不正确的命名空间(这就是为什么你收到空引用异常):

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的实现存在一些问题。

相关内容

  • 没有找到相关文章

最新更新