none
关于反射加载Form RRS feed

  • 问题

  • #这是load dll文件代码
    private void LoadAllPlugins() { string DictionaryPath = Application.StartupPath; string[] folders = Directory.GetDirectories(DictionaryPath + "\\Plugins\\"); foreach (string folder in folders) { string[] files = Directory.GetFiles(folder); foreach (string file in files) { if (file.Substring(file.LastIndexOf(".")) == ".dll") { try { Assembly ab = Assembly.LoadFile(file); Type[] tempTs = ab.GetTypes(); foreach (Type tp in tempTs) { if (IsValidPlugin(tp)) { Splash.Status = "正在加载模块..." + tp.Name+".dll"; AssemlyModel model = new AssemlyModel(); model._Assembly = ab; model._Fullname = tp.FullName; Assemblyplugins.Add(model); LoadPluginsAndTool(ab, tp.FullName); } } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "加载插件出错", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } } private bool IsValidPlugin(Type t) { bool ret = false; Type[] interfaces = t.GetInterfaces(); foreach (Type theInterface in interfaces) { if (theInterface.FullName == "IProjectPlusModel.IPlusModel") { ret = true; break; } } return ret; } List<PluginsModelClass> pluginmodellist = new List<PluginsModelClass>(); private void LoadPluginsAndTool(Assembly ass,string fullname) { try { PluginsModelClass model = new PluginsModelClass(); string buttonnames = ((IPlusModel)ass.CreateInstance(fullname)).ButtonName; addbutton(((IPlusModel)ass.CreateInstance(fullname)).ButtonName, fullname); AddMenuButton(((IPlusModel)ass.CreateInstance(fullname)).ButtonName, fullname); model.Author = ((IPlusModel)ass.CreateInstance(fullname)).Author; model.Authoremail = ((IPlusModel)ass.CreateInstance(fullname)).Authoremail; model.Pluginname = ((IPlusModel)ass.CreateInstance(fullname)).Pluginname; model.Summary = ((IPlusModel)ass.CreateInstance(fullname)).Summary; model.Version = ((IPlusModel)ass.CreateInstance(fullname)).Version; model.PluginType = ((IPlusModel)ass.CreateInstance(fullname)).plugintype; pluginmodellist.Add(model); } catch (Exception exp) { throw new Exception(exp.Message); } }
    # 这是Form代码
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using IProjectPlusModel;
    
    namespace ForecastFormSystem
    {
        public partial class ForecastForm : Form,IPlusModel
        {
            public ForecastForm()
            {
                InitializeComponent();
            }
    
            #region IPlusModel Members
    
            public void OnShowDlg()
            {
                this.Show();
            }
    
            public new Form ParentForm
            {
                set { this.MdiParent=value; }
            }
    
            public string ButtonName
            {
                get { return "预报制作"; }
            }
    
            public string Pluginname
            {
                get {return "精细化报文制作"; }
            }
    
            public string Author
            {
                get { return "武大郎"; }
            }
    
            public string Version
            {
                get { return "V1.0.0"; }
            }
    
            public string Authoremail
            {
                get { return "EMAIL REMOVED"; }
            }
    
            public string plugintype
            {
                get { return "功能插件"; }
            }
    
            public string Summary
            {
                get { return "无"; }
            }
    
            public Image ButtonICO
            {
                get { throw new Exception("The method or operation is not implemented."); }
            }
    
            public string ServerIP
            {
                get
                {
                    return DataSource;
                }
                set
                {
                    DataSource = value; ;
                }
            }
    
            public string ServerID
            {
                get
                {
                    return userid;
                }
                set
                {
                    userid = value;
                }
            }
    
            public string ServerPSW
            {
                get
                {
                    return password;
                }
                set
                {
                    password = value;
                }
            }
    
            public GlobalStaticInfo.StaticUserInfo staticuserinfo
            {
                get
                {
                    throw new Exception("The method or operation is not implemented.");
                }
                set
                {
                    throw new Exception("The method or operation is not implemented.");
                }
            }
    
            #endregion
    
            string password = "sa";
            string userid = "sa";
            string DataSource = "192.168.0.200";
            private void Initialize()
            {
                this.forecastTable1.Password = password;
                this.forecastTable1.Userid = userid;
                this.forecastTable1.DataSource = DataSource;
            }
    
            private void ForecastForm_Load(object sender, EventArgs e)
            {
                Initialize();
            }
        }
    }
    当运行的时候会提示  调用的目标发生了异常:
       在 TryMainForm.Meteorological.LoadPluginsAndTool(Assembly ass, String fullname) 位置 D:\WorkSpace\FinalProjectSolution\TryMainForm\TryMainForm\Meteorological.cs:行号 241
       在 TryMainForm.Meteorological.LoadAllPlugins() 位置 D:\WorkSpace\FinalProjectSolution\TryMainForm\TryMainForm\Meteorological.cs:行号 194


    一天了整的头都大了  
    为了.NET而奋斗
    2009年10月12日 8:36

答案

  • 要把错误信息中的文件复制到搜索路径或者GAC

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 C#蚂蚁 2009年10月13日 5:35
    2009年10月13日 4:38
    版主
  • 你好!
         可以有如下方法来解决:
         1,添加ForecastTable这个程序集的引用
         2,直接把这个程序集注册到GAC
    周雪峰
    • 已标记为答案 C#蚂蚁 2009年10月13日 5:35
    2009年10月13日 4:49
    版主

全部回复

  • 你好!
         请问是哪一行抛出的异常,抛出的具体是什么类型的异常?
    周雪峰
    2009年10月12日 10:51
    版主
  •   string
     buttonnames = ((IPlusModel)ass.CreateInstance(fullname)
    ).ButtonName; 到这一行就出错。   
    _xcode = -532459699
    _HResult = -2146232828
    _innerException = {"未能加载文件或程序集“ForecastTable, Version=1.0.3572.29936,
     Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。
    ":"ForecastTable, Version=1.0.3572.29936, Culture=neutral, PublicKeyToken=null"}

    异常中就这么多信息。

    为了.NET而奋斗
    2009年10月13日 1:01
  • 要把错误信息中的文件复制到搜索路径或者GAC

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 C#蚂蚁 2009年10月13日 5:35
    2009年10月13日 4:38
    版主
  • 你好!
         可以有如下方法来解决:
         1,添加ForecastTable这个程序集的引用
         2,直接把这个程序集注册到GAC
    周雪峰
    • 已标记为答案 C#蚂蚁 2009年10月13日 5:35
    2009年10月13日 4:49
    版主
  • 错误信息中的文件 已经在搜索路径中。

    为了.NET而奋斗
    2009年10月13日 5:05
  • ~~~~ 如果将ForecastTable这个程序集放到 Application.StartupPath 下就没错误了,这是为什么呢?在ForecastFormSystem这个项目中已经引用了ForecastTable.dll  最终的工程反射加载的是ForecastFormSystem.dll文件,那 只要ForecastTable.dll与ForecastFormSystem.dll在同一个文件下不就可以了么?
    为了.NET而奋斗
    • 已标记为答案 C#蚂蚁 2009年10月13日 5:34
    • 取消答案标记 C#蚂蚁 2009年10月13日 5:35
    2009年10月13日 5:12
  • 如果要直接使用ForecastTable.dll,不能通过间接引用的方式!
    周雪峰
    2009年10月13日 5:32
    版主
  • 多谢两位版主!
    为了.NET而奋斗
    2009年10月13日 5:36
  • 不客气啊!
    欢迎常常来这里和大家交流啊!
    周雪峰
    2009年10月13日 5:39
    版主