2011-07-22 35 views
3

我想如果我加載.net程序集(這是一個exe)到我自己的appdomain中並通過refleciton獲取對象引用,我可以獲得對EXE中包含的對象的引用。我可以獲得對組件中包含的對象的引用嗎?

我真的可以這樣做嗎?

這裏是我的示例代碼...

myDomain = AppDomain.CreateDomain("MyAppDomain"); 
myDomain.ExecuteAssembly(exePath); 

Assembly myAssembly = myDomain.GetAssemblies().Single(a => a.FullName.Contains("TestAssembly")); 

Type t = commandsAssembly.GetType("TestClass"); 

以任何方式,我可以得到這個類型的對象的引用?

編輯: 在我的EXE的主要方法中,我創建了一個TestClass類型的對象,我想引用該對象。我認爲是ExecuteAssembly將在新的appdomain中執行exe,所以當EXE實例化時,我的對象將被創建。如果我錯了,請糾正我。的CreateInstance將創建一個新的對象,但我想引用當執行EXE其被創建我的對象......可能是我的一個愚蠢的方式思考,請大家指正...提前

感謝

+0

ExecuteAssembly不會返回到Main方法的末尾...您的TestClass引用是否仍然存在或已經處理?請更清楚地解釋你爲什麼要做你描述的內容。 – Yahia

+0

Yahia @這只是示例代碼,我將在另一個線程中調用ExecuteAssembly,並使用myDomain來獲取對該域中運行的實際對象的引用。我想如果我可以創建一個迷你框架來做UI測試自動化。爲了直截了當,我想抓住一個appdomain中所有類型的實例。 – coolcake

+0

看到我的編輯...如果你真的需要這樣做有選擇,你會「只是」需要做一個好的(內存)探查器必須做的 - 至少作爲一個起點...... – Yahia

回答

2

嘗試commandsAssembly.CreateInstance ("TestClass");Activator.CreateInstance (t);

編輯 - 添加後,所有的生活實例是興趣:

我覺得唯一實現這是寫一些 「調試」,這實在是一個艱難的選擇...的一些潛在的有用的鏈接

http://blogs.msdn.com/b/davbr/archive/2011/02/01/clrprofiler-v4-released.aspx
http://www.codeproject.com/Articles/122592/Writing-a-NET-debugger-part-1-Starting-the-debuggi
http://www.codeproject.com/Articles/122591/Writing-a-NET-debugger-part-2-Handling-events-and
​​
http://www.codeproject.com/Articles/132798/Writing-a-NET-debugger-part-4-breakpoints
http://msdn.microsoft.com/en-us/library/bb190764.aspx
http://msdn.microsoft.com/en-us/library/ms229861.aspx

CLR分析器需要做你想要的部分 - 源可用也許是一個好開始...

+0

謝謝。我正在尋找這種東西。我將通過你的鏈接和我的東西工作。 – coolcake

3

簡單的方法:

object instance = Activator.CreateInstance(myType, [constructorArg1, ...]); 

它假設一個類型的公共構造函數。

+0

在我的EXE的主要方法中,我創建了一個TestClass類型的對象,我想引用該對象。我認爲是ExecuteAssembly將在新的appdomain中執行exe,所以當EXE實例化時,我的對象將被創建。如果我錯了,請糾正我。 CreateInstance將創建一個新的對象,但我想引用我的對象,它會在執行EXE時創建... – coolcake

+0

@coolcake hm,這有點奇怪。您需要AppDomain中的某個根對象的句柄,並遞歸搜索圖表以查找所需的參考。 –

+0

非常感謝雷克斯,認爲只有一個簡單的課程,我怎樣才能得到它的參考?我不能使用get類型並檢索它嗎? – coolcake

相關問題