[英]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();
如果類屬於Form
則Assembly.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.