0

我有一个 winform 应用程序和一个服务 DLL (C#),它们都在同一个解决方案和命名空间中。我正在动态加载 DLL,以便将来可以更新 DLL。主窗体从动态加载的 DLL 中调用一个方法,并将 self( 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 “知道” 主窗体,以便它可以与它的成员和方法交互?有没有更好的方法来实现这个目标?

谢谢

4

1 回答 1

1

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

如果您不能这样做,您将无法使用反射来调用成员。

如果您只需要从 dll 访问基本 Form 成员,则可以将参数声明为Form而不是Form1. 这会让你调用类似.Close.

于 2013-07-29T14:53:11.303 回答