2013-07-29 99 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