2009-08-14 76 views
2

由於裝配有一個入口點,如:[net]如何將調試代碼注入程序集?

int FooClass::doFoo(int x, double y) 
{ 
    int ret; 
    // Do some foo 
    return ret; 
} 

是否有可能又使用另一個組件模擬像:

int FooClass::doFoo(int x, double y) 
{ 
    int ret; 
    TRACE_PARAM_INT(x) 
    TRACE_PARAM_DOUBLE(y) 
    // Do some foo 
    TRACE_RETURN_INT(ret) 
    return ret; 
} 

而且只啓用此代碼注入時DEBUG存在。如果有這種方式,你如何加載「調試」程序集?

編輯1:#ifdef不是一個選項。說,我不想修改代碼庫。

編輯2:我的主要問題是「如何將代碼注入已編譯的程序集」。我有基本代碼,但我寧願不在主代碼中添加用於跟蹤的K行,但有另一個程序集可以這樣做。我知道如何使用VS進行調試,我想要的是添加變量的跟蹤機制(除其他外)。

+0

您是說因爲任何原因您不能觸摸原始程序集? – Jared314 2009-08-17 22:46:24

回答

10

您可以嘗試一個AOP後編譯器,如PostSharp。它適用於所有.net語言,但我沒有用C++試過。

+0

同意,我用企業庫日誌塊postharp,記錄參數傳遞給一個方法,它運作良好(c#) – Neil 2009-08-17 14:07:57

-2

取決於您是否有程序集的源代碼以及是否可以重新編譯它以允許調試。

假設您有源代碼,並且您可以在啓用調試的情況下對其進行編譯,那麼您應該可以使用開發人員工具(Visual Studio,我猜測)單步執行代碼並查看值X,Y和ret,當你走。

這不會要求修改代碼 - 只是編譯調試版本的能力。

3

爲了將代碼注入到現有程序集中,我將使用Cecil庫,該庫可讓您使用IL。這會讓你重寫程序集,如果這就是你想要的。我必須警告你:這是不小的壯舉。

哦,還有一個Reflector的加載項,稱爲Reflexil,它允許您編輯程序集。

順便說一下,基於AOP的跟蹤不會將代碼直接添加到您的程序集。你可以將所有AOP的東西保存在一個單獨的程序集中(實際上,這是一個非常好的主意),然後將其應用於屬性。 PostSharp將爲您編寫代碼,但其他AOP框架(如Spring或PIAB)使用動態代理時使事情更加靈活,因此您可以在不需要時有效地「關閉」您的方面。

2

The Enterprise Library Policy Injection Application Block允許您在方法調用之間執行代碼。它不會做你在問題中要求的複雜的東西,它涉及在代碼中注入代碼,但它可能已經足夠滿足你的需求,並且它是免費的。

+0

這實際上可以滿足我的需求。我並不需要向方法的主體注入代碼,但需要跟蹤方法調用和返回語句。 – Anzurio 2009-08-19 01:19:23

0

如果doFoo函數不是虛擬的,或者如果不通過接口訪問該類,則不能這樣做。

原因是,當你正在編譯使用doFoo的類被編譯來調用確切的類的確切功能。因此,在編譯時評估接收調用的目標類。 但是,如果該函數是虛擬的,或者通過接口訪問類,則將在運行時評估接收調用的目標類。因此,爲了使用任何AOP(面向方面​​編程)或DI(直接注入)框架來完成你想要的任務,目標類需要滿足這些條件之一。通常通過接口訪問類將是首選方式。

這裏有很多不同的AOP和DI框架,但帖子並不是關於哪一個使用的,所以我會讓自己不這樣做,但是如果你不需要這樣的話,你可以使用DynamicProxy創建裝飾器以添加日誌記錄功能,包括界面和具有虛擬功能的類。後者創建了一個新類,它是您已經擁有的一個子類

相關問題