2013-04-22 47 views
2

我有一個名爲「Communication」的對象,它有一個「CreatePdfFromTemplate」方法。該方法將從Windows服務中調用,該服務在表上具有SqlDependancy,當網站上的方法添加新行時將通知該服務。如何從另一個DLL中的對象獲取類型?

在我的方法中,我傳遞了一個具有「Id」和「Name」的自定義對象列表。名稱是我需要使用反射加載的對象的名稱。例如,「指令」。 「Id」是需要從數據庫加載的「Name」中引用的對象的Id。此對象在我的「通信」DLL的運行時未被引用或可用。

我目前正處於第一個障礙。我試圖做到以下幾點作爲第一步:

// Load object information using Reflection 
Type objectType = Assembly.GetExecutingAssembly().GetType(queueObject.Name); 
int objectId = queueObject.Id; 

我發現從我的搜索一些信息的答案是說有一種方法通過使應用程序緩存中或GAC可用來加載DLL ,但我不確定這是否是最好的選擇。

我從來沒有使用過反射之前,所以如果你有任何意見,或任何建議的方式,我已經選擇了一般的結構(即網站添加行數據庫表,SqlDependancy在Windows服務火災,調用通訊服務DLL創建PDF)。

只是爲了提供更多信息,我選擇這樣做的原因是因爲我的模板包含{Instruction.CreatedDate}等標籤,其中「Instruction」是對象的名稱,「CreatedDate」是一個屬性的名稱,它的值將替換標籤。

任何幫助如何加載這個「指令」對象在我的反射或只是在我的結構一般是非常感謝。讓我知道如果我沒有給出足夠的信息,或者我所說的不夠清楚(這是我的第一個StackOverflow問題,雖然我很長時間潛伏着)。

謝謝。

--UPDATE--

好了,使用這個想法從馬騰提出,我已成功地加載我的組裝和從它那裏得到一個類型,但我已經稍有不同做了。我是不是能夠把使用Assembly.LoadFile方法的具體路徑,所以我已經做了這樣的:

Assembly executingAssembly = Assembly.GetExecutingAssembly(); 
Assembly objectAssembly = Assembly.Load(executingAssembly 
              .GetReferencedAssemblies() 
              .Where(a => a.Name == "Common") 
              .FirstOrDefault()); 

這工作,因爲該類型我試圖讓,是一個參考的一部分彙編在我的通訊服務中稱爲「Common」(這是一個使用nuget安裝的軟件包,以幫助保持最新,因爲它經常變化)。

關於我如何做這件事的任何進一步的帖子,如果它是正確或錯誤的方式將不勝感激!

+0

如何獲得其他程序集?它們位於哪裏,它們是如何提供的?它們是否會在應用程序運行時更新?如果程序集已更新,是否可以重新啓動應用程序? – cremor 2013-04-22 12:56:48

回答

3

使用Assembly.LoadFile或其他過載裝載組件。

使用Assembly.GetType獲取類型。

一旦你有了類型,就使用Activator.CreateInstance

將其轉換爲dynamic,並調用您的方法或設置屬性。我假設你正在使用.net 4.0。

var myAssembly = Assembly.LoadFile(...); 
var myType = myAssembly.GetType(...); 
dynamic myObject = Activator.CreateInstance(myType); 
if (myObject != null) { 
    var createdDate = myObject.CreatedDate; 
} 
+0

感謝您的信息。但是,如果我使用Assembly.LoadFile,則必須提供路徑引用,並且我引用的DLL經常更新。在這種情況下,是否最好在程序包中添加nuget參考(我們在整個站點中已經使用nuget),並直接在我的服務bin目錄中引用DLL? – yellowbrickcode 2013-04-22 12:09:51

相關問題