2013-07-29 142 views
0

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

守则主要形式:

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

DLL将需要有exe文件的项目的引用(或定义的基类或接口第3项目),无论为了得到会员的EXE和DLL参考)在设计时。

如果你不能这样做,你就会被反射卡住成员。

如果您只需要从dll访问基本表单成员,则可以声明参数为Form而不是Form1。这会让你打电话给.Close

+0

我最终引用了exe的项目,正如你所建议的,它的工作原理。 出于好奇,起初我设法使用了反射(在我参考exe之前),并且我使用'type.GetMethod(“funcName”)在主窗体中调用了公共方法。调用(formObj,new object [] {} );',但我无法找到访问公众成员及其内在价值的方法。有没有办法? – Yoram

+1

您可以使用'Type.GetMember','Type.GetField','Type.GetConstructor'等适当版本来访问属性,字段和方法......您还可以获得非公共方法(并且可以在外部调用它们)通过传递'BindingFlags'来指示你想要的可见性级别。 –

+0

谢谢,我会试试看。 – Yoram