假设在类库中我美化了一个 Form,我称作“MyForm”
//类库
namespace MyNamespace
{
    public class MyForm : Form
    {
        //........
    }
}【----------------------------------------------------------------】//应用程序,项目A
using MyNamespace; //调用的类库
namespace ProgramA
{
    public partial class TestForm1 : MyForm //继承与类库的 Form1
    {
        //........
    }
    public partial class TestForm2 : MyForm //继承与类库的 Form2
    {
        //........
    }}然后在项目 A 里,在指定路径里,比如我们在根目录(与 TestForm 同目录)下创建 ActionTest.cs。
大致内容如下:
namespace ProgramA
{
    public class ActionTest
    {
        //........        public void TestForm1()
        {
             //........   
        }        public void TestForm2()
        {
             //........   
        }        //........
    }
}
需求是:类库编写者,知道有这个 ActionTest.cs 文件存在,并且知道路径存放位置。
那么,在类库中,我们如何通过不同的 TestForm 去调用 ActionTest.TestFormX

解决方案 »

  1.   


    我明白你的意思。
    但是我看到 ASP.NET MVC 。他就实现了这样的需求。
      

  2.   


    首先把ProgramA编译成一个dll,然后在类库中添加其引用 public partial class MyForm : Form    {
            public void CallMethod()
            {
                ActionTest actionTest=new ActionTest();
                Type type = typeof(ActionTest);
                System.Reflection.MethodInfo method=type.GetMethod(this.GetType().Name);
                method.Invoke(actionTest, null);
            }
        }
      

  3.   

    public partial class TestForm1 : MyForm //继承与类库的 Form1
        {
    private void Call()
    {
    base.CallMethod();
    }
        }
      

  4.   

    string path=AssemblyName;//项目的Assembly选项名称
    string name=strName; //类的名字
    Form fm=(Form)Assembly.Load(path).CreateInstance(name);
    fm.MdiParent=this.ParentForm;
    fm.Show();object target = Assembly.GetExecutingAssembly().CreateInstance("", true);
    Type type = new ActionTest.GetType();
    MethodInfo methodInfo = type.GetMethod("", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
    methodInfo.Invoke(target, null);
      

  5.   

    5楼与楼主的意思搞反了.有两个程序集:
    (1)类库 (*.DLL)  MyForm类
    (2)项目A (*.EXE)   ProgramA在项目A中
      

  6.   

    wuyq11你好,
    如果类库中实例化Form fm=(Form)Assembly.Load(path).CreateInstance(name); 与项目中正在运行的MyForm是两个实例了,执行方法,效果应该反映不到项目中正在运行的窗体上.问题是:
    被引用中的类库中,如何操作(引用)正在运行的项目中的子类实例窗体呢?有办法吗?
      

  7.   


    应用模型?
    简单的说。
    比如一个 站点的文件夹结构如下:

    Admin
    ->Roles.aspx
    ->ChangeRoles.aspx
    ->AddRoles.aspx
    ->Users.aspx
    ->ChangeUsers.aspx
    ->AddUsers.aspx
    ......
    这样如果,把所有的方法集中在一起,那么更方便管理。
      

  8.   


    我当然知道反射这么用。
    我的意思是,这个 ActionTest 你要怎么获得呢?
      

  9.   


    你好,能否简单示例下?对您的代码,我有点不理解,尤其是前段代码。to lzsh0622:
    我最想知道,类库程序集里如何获取项目程序集。
    比如最简单,我可以这样。//类库
    namespace MyNamespace
    {
        public class MyForm : Form
        {
            private void Form_Load(object sender,EventArg e)
            {
                 //..假设,当TestForm1.Show()时,执行 ActionTest.TestForm1() 函数。
            }
        }
    }
      

  10.   

    如果ActionTest和TestForm在同一项目
    使用ActionTest at = new ActionTest();at.TestFrom1();调用。
    如果不在同一项目:
    一定要引用ProgramA项目或程序集如果层次关系没有办法引用
    那就在TestForm定义一个接口IAction(接口中TestFrom1();TestFrom12())让ActionTest实现接口.
    在TestForm 定义一个字段pubcli IAction Action;TestForm 调用Action.TestFrom1().
    注意程序运行时需要把ActionTest实例赋给Action。
      

  11.   

    如果不在同一项目:
    一定要引用ActionTest项目或程序集 
      

  12.   

    其实不能完全说是 父类 调用 子类。
    应该说,子类 扩展  父类。to zcl24:
    你的方案不错。可惜,这样就不是我要的初衷了。