none
找不到MessageBox RRS feed

  • 问题

  • 我需要在一个不包含System.Windows.Form 命名空间的程序域中使用Message.Show()方法,用assembly.Load()来动态加载程序集,请问,我应该如何写代码?
     Assembly ass = Assembly.Load("System.Windows.Forms");
                object obj = ass.CreateInstance("System.Windows.Forms.MessageBox");
                Type typ = obj.GetType();
                MethodInfo mtd = typ.GetMethod("Show");
                mtd.Invoke(obj, null);
    然后,调用MessageBox.Show();方法 里面是两个string类型的参数  提示找不到MessageBox
    请问,我写的有什么问题,该如何解决? 谢谢
    2009年12月16日 7:16

答案

  • 明白你的意思了啊!
    你可能对反射存在一定的误解,不是说你上面执行了一次反射,以后就可以引用MessageBox了!
    你如果通过反射来实现,无论什么时候都不可能直接使用MessageBox的,每次想调用这个MessageBox.Show方法,都需要这样!
    t.InvokeMember("Show", BindingFlags.InvokeMethod, null, null, new object[] { "asdf","消息" });

    你动态加载程序集,只能通过上面的方法来调用MessageBox.Show方法,不可能直接引用MessageBox!除非你直接添加这个程序集引用!
    周雪峰
    • 已标记为答案 chumen 2009年12月17日 0:36
    2009年12月16日 15:44
    版主

全部回复

  • 你好!
         MessageBox并没有提供公共的构造函数,所以无法实例化,你这样调用:
                Assembly a=Assembly.Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
               
                Type t=a.GetType("System.Windows.Forms.MessageBox");
                t.InvokeMember("Show", BindingFlags.InvokeMethod, null, null, new object[] { "asdf","消息" });
    周雪峰
    2009年12月16日 7:50
    版主
  • 希望对你有帮助啊!
    周雪峰
    2009年12月16日 7:50
    版主
  • 你好!

    即然不是 form 的项目就不要使用 MessageBox。如果你是需要在业务逻辑层弹出消息,可以改为返回状态值。在 form 界面程序中获取这个值,然后根据值的内容弹出信息。

    知识改变命运,奋斗成就人生!
    2009年12月16日 7:51
    版主
  • 这是静态方法不需要创建实例的
     这是我在控制台中做的测试

     private static void TestMessageBox()
            {
                Assembly ass = Assembly.Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
                //object obj = ass.CreateInstance("System.Windows.Forms.MessageBox");
                Type type = ass.GetType("System.Windows.Forms.MessageBox");

                MethodInfo method = type.GetMethod("Show", new Type[1] { typeof(string) });
                method.Invoke(null, new object[1] { "信息" });

            }


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年12月16日 7:54
    版主
  • 谢谢你得解答,我要做的就是老师要求不去引用System.Windows.Forms,而调用MessageBox,我按照大家的方法做的 但还是不对。下面是代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;

    namespace 加载程序集
    {
        class Program
        {
            static StringBuilder sbuilder = new StringBuilder();
            static void Main(string[] args)
            {
                Assembly ass = Assembly.Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
                //object obj = ass.CreateInstance("System.Windows.Forms.MessageBox");
                Type type = ass.GetType("System.Windows.Forms.MessageBox");

                MethodInfo method = type.GetMethod("Show", new Type[1] { typeof(string) });
                method.Invoke(null, new object[1] { "信息" });

                Type t = typeof(double);
                AnalyzeType(t);
                MessageBox.Show(sbuilder.ToString(), "Analysis of type" + t.Name);
                Console.ReadLine();
            }
          
            static void AnalyzeType(Type t)
            {
                AddToOutput("TypeName:" + t.Name);
                AddToOutput("FullName:" + t.FullName);
                AddToOutput("Namespace:" + t.Namespace);
                Type tBase = t.BaseType;
                if (tBase != null)
                    AddToOutput("BaseType:" + tBase.Name);
                Type tUnderlyingSystem = t.UnderlyingSystemType;
                if (tUnderlyingSystem != null)
                    AddToOutput("UnderlylingSystem Type:" + tUnderlyingSystem.Name);

                AddToOutput("\nPublic Members:");
                MethodInfo[] methods = t.GetMethods();
                foreach (MethodInfo nextMethodInfo in methods)
                {
                    AddToOutput("\n" + nextMethodInfo.Name + ":" + nextMethodInfo.IsFamily);
                }
                MemberInfo[] members = t.GetMembers();
                foreach (MemberInfo nextMember in members)
                {
                    AddToOutput(nextMember.DeclaringType + " "
                        + nextMember.MemberType + " "
                        + nextMember.Name);
                }
            }

            private static void AddToOutput(string text)
            {
                sbuilder.Append("\n" + text);
            }
        }
    }

    2009年12月16日 8:51
  • 你好!
         MessageBox并没有提供公共的构造函数,所以无法实例化,你这样调用:
                Assembly a=Assembly.Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
               
                Type t=a.GetType("System.Windows.Forms.MessageBox");
                t.InvokeMember("Show", BindingFlags.InvokeMethod, null, null, new object[] { "asdf","消息" });
    周雪峰
    你不要使用ass.CreateInstance这种方式,这个MessageBox不能实例化,你用我上面这些代码,已经测试通过了!
    周雪峰
    2009年12月16日 12:10
    版主
  • 你好! 谢谢你的回答,我上面的代码没有用到ass.CreateInstance()方法。 用你提供的方法同样找不到MessageBox 请问你是如何引用 MessageBox。Show()的 难道 写了上面的代码 下面还不能直接引用吗?或者你可以帮助我改改上面的代码。 谢谢
    2009年12月16日 14:00
  • 明白你的意思了啊!
    你可能对反射存在一定的误解,不是说你上面执行了一次反射,以后就可以引用MessageBox了!
    你如果通过反射来实现,无论什么时候都不可能直接使用MessageBox的,每次想调用这个MessageBox.Show方法,都需要这样!
    t.InvokeMember("Show", BindingFlags.InvokeMethod, null, null, new object[] { "asdf","消息" });

    你动态加载程序集,只能通过上面的方法来调用MessageBox.Show方法,不可能直接引用MessageBox!除非你直接添加这个程序集引用!
    周雪峰
    • 已标记为答案 chumen 2009年12月17日 0:36
    2009年12月16日 15:44
    版主
  • 你好!
           很感谢你的回答,终于明白了,也谢谢大家的回答。
    2009年12月17日 0:36
  • 不客气啊!
    周雪峰
    2009年12月17日 3:24
    版主