2009-02-11 67 views
5

我正在尋找一種更有效的方法來從已知特定類型派生的裝配中查找類型。基本上,我在我的應用程序中的插件架構,和時間最長的,我們一直在做這樣的:如何在Assembly中有效地定位特定類型*?

For Each t As Type In assem.GetTypes() 
    If t.BaseType Is pluginType Then 
     'Do Stuff here' 
    End If 
Next 

一些插件有大量的類型,我們已經開始看到這種採取幾秒鐘。有沒有什麼辦法可以請求所有類型爲「pluginType」的BaseType?編輯: 我過分簡化了我的代碼示例。我在我的實際代碼中使用了.GetExportedTypes()。但是,我有很多類都被標記爲Public,所以它沒有太多幫助。除了實際的插件類以外,我梳理了項目並標記了所有「朋友」,並且它仍然花費幾乎相同的時間來檢查程序集。我從1.3秒(也就是不到10%)中減去了100毫秒。這只是我必須處理的最短時間嗎?我也嘗試了Assembly Attribute的建議,但它仍然沒有產生太大的差別(也許再次是100ms)。剩下的時間是我必須支付動態加載程序集的開銷嗎?

+0

不是真正的問題答案,但也許看看MEF:http://www.codeplex。com/MEF – herskinduk 2009-02-11 14:28:41

+0

真實的測試條件要複雜多少?你使用`AndAlso`和`OrElse`還是`And`和`Or`?我問,因爲在我最慢的機器上,使用DotLisp解釋器,枚舉14807個類型需要0.322秒,使用`BaseType = Component`獲取公共類型需要0.458秒。哦,在這臺較慢的機器上檢查編譯的LinqPad版本的查詢後,我發現問題:在Type類型對象被緩存之前,甚至在後臺構建之前,它的速度要慢得多:10961`Types`在10.206秒內枚舉!緊接着,找到`Components`只有0.03323秒。 – 2014-02-21 10:04:27

回答

1

Assembly.GetExportedTypes()只返回公共類。這可以幫助嗎?

+0

請參閱更新的問題... – 2009-02-11 20:17:28

4

首先,您可以嘗試使用GetExportedTypes()來縮小潛在類型的範圍。除此之外,你無法加速迭代過程。你可以,但是,包括將特定組件內指定插件的確切類型(類型)插件mainfest:

<manifest> 
    <plugin type="FooBar.Plugins.BazPlugin, FooBar" /> 
</manifest> 

,使你能夠做到Type.GetType(string)

IPlugin plugin = (IPlugin)Type.GetType("manifest/plugin/@type" /* for the sake of this discussion */); 
+0

請參閱更新的問題... – 2009-02-11 20:16:53

0

我們插件系統利用屬性來識別插件類型。然後我們只是掃描程序集中的特定屬性。

1

來自mono-devel mailing list post by Jonathan PryorPlug-in Framework (Part1): Marking Types for Consumption的解決方案:使用匯編級屬性

總之,你會添加一個新的屬性:

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple=true)] 
class PluginAttribute : Attribute { 
    public PluginAttribute (Type type) {this.Type = type;} 
    public Type Type {get; private set;} 
} 

然後指定在組件級別該屬性:

[assembly:Plugin (typeof(Plugin1))] 
[assembly:Plugin (typeof(Plugin2))] 

然後查詢大會所有PluginAttributes:

Assembly a = ...; 
PluginAttribute[] plugins = 
    (PluginAttribute[]) a.GetCustomAttributes (
     typeof(PluginAttribute), true); 
foreach (var plugin in plugins) 
// plugin.Type is the type to use as a plugin 

這可以明顯快於使用Assembly.GetTypes()/Assembly.GetExportedTypes(),只有 [assembly:Plugin]屬性中列出的類型實際上需要加載 ,這可以顯着減少消耗的內存量(取決於程序集中的類型數量)。

0

鑑於我對這個問題的評論,如果可以的話,在做其他事情時枚舉另一個線程上的所有類型。然後,根據my tests,當你準備枚舉所需的類型時,它應該至少快兩個數量級。

相關問題