2017-01-22 21 views
1

請原諒我只是爲了掌握這些術語,我在這裏是C#知識的邊緣,需要尋求指導。我有一個DLL,其中包括兩個類和一個窗體(附加類)其中一個類的工作項具有公共(字符串名稱,int ID)。填充列表<things>在反映外部dll類

// in the DLL: 
public class workitems { 
    public string name {get;set;} 
    public int id{get;set;} 
} 

主力類具有多種功能

// in the DLL: 
public class workhorse { 
    List<workitems> WorkLoad = new List<workitems>(); 

    public function DoThings() { ..... stuff ...... } 
} 

在另一程序中使用的變量,我需要調用此DLL(I經由反射假定)。我試過

// in a separate C# script that needs to call this via reflection 
Assembly asm = Assembly.LoadFile(thedll); 

,但我無法弄清楚如何工作項加載到變量,然後調用從DLL函數與工作項...我越來越糊塗型/班/ methodinfo/.GetType ...任何指導將不勝感激。

從已經調用的DLL文件,我需要做些什麼樣的程序:

otherdll.workload.add(stuff) 

otherdll.DoThings(); (which uses the workload from that class) 
+0

我很好奇,爲什麼你會說:「我需要調用這個DLL(我通過反思)」。爲什麼不直接引用該dll?可能有一個很好的理由,但是你的問題意味着你由於缺乏知識而選擇了最困難的方式。 – TnTinMn

回答

1

該代碼假定,那您已經在組件和Workload是現場,沒有屬性:

//Get workhorse TypeInfo 
var type = asm.ExportedTypes.Single(t => t.Name == "workhorse"); 
// Create instance of workhorse 
var obj = Activator.CreateInstance(type); 
// Get FieldInfo WorkLoad 
var prop = type.GetField("WorkLoad"); 
// Get object workhorse.WorkLoad 
var list = prop.GetValue(obj); 
// Get MethodInfo for Add method 
var method = prop.FieldType.GetMethod("Add"); 
// Call it with new object 
method.Invoke(list, new [] { (object)new workitems()}); 
// Get DoThings methodinfo 
var doThings = type.GetMethod("DoThings"); 
// call it without parameters 
doThings.Invoke(obj, new object[0]); 
+0

謝謝!我除了以下內容:我如何創建和設置{(對象)新工作項()中的值} 我正在嘗試 WorkLoadItemType.GetProperty(「email」).setValue(obj,「test」+ i ); 但沒有得到任何地方 –

+0

@DanFlood是電子郵件的財產?如果它是一個實體,你應該調用WorkLoadItemType.GetField(「email」) –

+0

AHA!謝謝,它只是沉沒。非常感謝您的幫助! –