2011-06-21 83 views
0

我已經研究了這一點,並且無法建立正確的方法。我的問題如下所示:我有一個winForms應用程序,並且在其中我希望啓動一個時間敏感的.dll。我能做到這一點使用的System.Reflection沒有問題,像這樣的如何從運行時啓動的.dll內啓動Windows窗體

// Execute the method from the requested .dll using reflection (System.Reflection). 
    //[System.Runtime.InteropServices.DllImport(strDllPath)] 
    DLL = Assembly.LoadFrom(strDllPath); 
    classType = DLL.GetType(String.Format("{0}.{0}", ListUfCmdParams[1])); 
    classInst = Activator.CreateInstance(classType); 
    XmlExpInfo = classType.GetMethod(DllParams[0]); 
    XmlExpInfo.Invoke(classInst, paramObj); 

    // Return something. 
    return String.Format("Method '{0}' from '{1}{2}' successfully executed!", 
    ListUfCmdParams[2], ListUfCmdParams[1], strDotDll); 

這個偉大的工程,但被調用的過程是如此耗費時間我想顯示對所發生的事情的用戶。爲此,我在.dll文件中包含了一個WinForm,它有一個progressBar和一些其他屬性。當我這樣做,我得到一個例外。當「Activator.CreateInstance()」嘗試工作時會發生這種情況:MissingMethodException「無法創建抽象類」。在使用部分類之前,我遇到過這個錯誤,而且我不得不從我的類中刪除「partial」關鍵字以使得.dll能夠正確執行(我剛剛擺脫了這個錯誤!)。我無法從上面的winForms類中刪除這個「partial」關鍵字,所以問題是「如何從我的.dll中調用winForm(如果確實有可能)?」這樣.dll可以顯示從調用應用程序執行的進度?

感謝您的時間,

尼克

詩篇。我已閱讀下列線程和他們有點含糊:

A DLL with WinForms that can be launched from A main app

等。

+0

鑑於您可以更改dll中的方法接口,難道您不能僅將一個進度條作爲參數傳遞給您上面的代碼調用的方法嗎? – Christian

+0

它與* partial *關鍵字沒有任何關係。首先通過*而不是*使用反射來工作。然後考慮保持這種方式。 –

+0

這聽起來像是一種合理的方法,但這不適合我的需求。這必須爲通用的.dll工作,這將使調用者太具體。我明白,「抽象類」與「部分類」聲明沒有任何關係。然而,「partial」關鍵字就是編譯器大喊大叫,爲了讓我的.dll被正確調用而必須刪除的東西。我會爲「不使用反射」,但我不famailar如何做到這一點管理的.dll;即使用.NET下的C#創建.dll。我以爲你只能使用'System.Relection'來做到這一點。 – MoonKnight

回答

0

我剛剛再次看到這個問題,並認爲我會更新我最終如何做到這一點。

最後,我發現以下是最有效的方式來執行上述我想要的。首先啓動一個保存進度信息的WinForm。其次youu從「Shown」事件中啓用「worker」方法。

的第一部分,即代碼調用使用反射下面提供在WinForm:

// Execute the method from the requested .dll using reflection (System.Reflection). 
    Assembly DLL = Assembly.LoadFrom(strDllPath); 
    Type classType = DLL.GetType(String.Format("{0}.{0}", strNsCn)); 
    object classInst = Activator.CreateInstance(classType, paramObj); 
    Form dllWinForm = (Form)classInst; 
    dllWinForm.ShowDialog(); 

我希望這可以幫助別人。

+0

什麼是「DLL」?我的意思是,它聲明瞭哪種數據類型? –

+0

爲您更新... – MoonKnight

0

你不應該讓被調用者(DLL)知道它的調用者(表單)。相反,你可以豐富你的DLL,執行與ProgressUpdated事件的時間密集型的方法的類:

public event ProgressUpdatedHandler ProgressUpdated; 
public delegate void ProgressUpdatedHandler(object sender, int stepsCompleted, int stepsTotal) 

這樣的形式可以簡單地分配處理該事件,並且每當它可以將DLL可能引發事件指出進展是什麼。

+0

使用反射時,這是如何完成的? – Christian

+1

就像'MethodInfo'一樣,你也可以使用反射來獲取任何事件的EventInfo對象(取決於你正在構建的東西,我想知道反射是否真的是首要的方法)。 –

+0

@C。 Evenhuis。 「使用反射時如何完成這個問題?」是一個很好的。沒有辦法通過System.Reflection將事件傳回給我的調用應用程序(我剛剛閱讀了上面的文章 - 我沒有意識到EventInfo的功能!我會看看這個)。而且,在目前的情況下(沒有.dll試圖啓動內部的WinForm),我的.dll執行時沒有「意識到」調用應用程序。我不確定這一點的基礎。謝謝你的時間。 – MoonKnight