簡體   English   中英

從動態加載的DLL中顯示表單

[英]Displaying a form from a dynamically loaded DLL

這是我之前在這里提出的問題的擴展。

長話短說,我使用以下代碼動態加載DLL並使用它創建一個type

Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
Activator.CreateInstance(type);

從那里我可以使用type來引用dllTest類中的幾乎任何東西。 默認情況下,該類在運行時應該顯示一個表單(在這種情況下,相當空白,因此它並不復雜)。

我覺得我在這里錯過了一個關鍵的代碼行,這樣可以防止表單在屏幕上加載。

dllTest.cs (在DLL中)包括:

namespace test
{
    public partial class dllTest : Form
    {
        public dllTest()
        {
            InitializeComponent();
        }
    }
}

InitializeComponent()設置表單的布局,這個太長了,無法粘貼到這里,不應該有所作為。

有任何想法嗎?

您必須對剛剛創建的表單執行某些操作:

Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
Form form = (Form)Activator.CreateInstance(type);
form.ShowDialog(); // Or Application.Run(form)

是的,您實際上並未指定在類初始化程序之外運行的任何代碼。 例如,對於表單,您必須實際顯示它們。

您可以將代碼修改為以下內容......

Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
Form form = Activator.CreateInstance(type) as Form;
form.ShowDialog();

如果類屬於FormAssembly.GetType()返回NULL 如果一個類屬於User Control那么我可以看到返回的類型。

語法也應如下:

Type type = assembly.GetType("Assemblytest.clsTest");

哪里

  • clsTest將是類(用戶控件的)的名稱
  • Assemblytest是沒有.dll擴展名的程序集的名稱。

我會選擇:

Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
object obj = Activator.CreateInstance(type);
Form form = obj as Form;
if (form != null)
    form.Show(); //or ShowDilaog() whichever is needed

應添加其他錯誤檢查/處理; 但至少我會確保轉換工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM