如何从动态加载的DLL调用的方法引用调用表单

时间:2013-07-29 10:00:56

标签: winforms method-invocation

我有一个winform应用程序和一个服务DLL(C#),它们都在同一个解决方案和命名空间中。 我正在动态加载DLL,以便将来更新DLL。 主窗体从动态加载的DLL调用一个方法,并将自身(this)作为变量传递。

主要表格中的代码:

namespace MyNamespace
{
    class Form1
    {
        int i = 5;
        // Code
        .....

        private void CallDllMethod()
        {
            try
            {
                Assembly assembly = Assembly.LoadFrom("DllName.dll");
                Type type = assembly.GetType("MyNamespace.Class2");

                object ClassObj = Activator.CreateInstance(type);
                type.InvokeMember("DoSomething", 
                                   BindingFlags.Default | BindingFlags.InvokeMethod, 
                                   null, 
                                   ClassObj, 
                                   new object[] { this });
            }
            catch (Exception){...}      
        }
    }
}

DLL中的代码:

namespace MyNamespace
{
    public class Class2
    {
        public void DoSomething(Form1 obj)
        {
                    ...
        }
    }
}

它告诉我它不知道Form1 obj,我想我理解为什么。

如何让dll“知道”主窗体,以便它可以与它的成员和方法进行交互? 有没有更好的方法来实现这一目标?

谢谢你

1 个答案:

答案 0 :(得分:1)

为了在设计时获取成员,Dll需要引用exe的项目(或定义基类或接口的第3个项目,exe和dll引用)。

如果你不能这样做,你就会被反射用来召唤成员。

如果您只需要从dll访问基本表单成员,则可以将参数声明为Form而不是Form1。这可以让你调用像.Close这样的东西。