2010-12-23 46 views
19

我目前正在調試的話題,提高調試__TransparentProxy例如,從團結的TransparentProxyInterceptor解決。如何在VisualStudio 2008中調試__transparentProxy實例?

常用的調試情況是,雖然節目是打破,我想看看公衆成員值或致電代理包裹實例的方法在VS2008 IDE或者監視窗口或立即窗口。

這裏談到的問題:當訪問公共財產,呼籲我的代理包裹的實例方法,我總是遇到異常消息,顯示在監視/即時窗口,說

「不能獲取類型爲「MyDomainObject」的實例的字段或調用方法,因爲它是遠程對象的代理。

我已經深入到網絡上的線程,發現這個異常的原因是由於.NET __transparentProxy的內部反射行爲。 __transparentProxy實例無法訪問__transparentProxy實例本身中的RealProxy實例中的相應屬性/方法。

據我所知,這裏有兩種方式(不包括外部工具,任何設計或協助),以獲得我想要的價值。一種方法是在Watch窗口中繼續展開並展開私有成員的值,並且在幾次點擊之後,我可以最終訪問無代理的原始實例,我可以在其中執行任何我想要的操作。另一種方式要快得多,但每次要訪問原始未加密實例時仍需要一點努力:RemotingServices.GetRealProxy(myProxiedObject).Target

無論哪種方式都是可行的,但需要一些努力來獲得我想要的實例,並且我想要的代理實例居住在深層次結構中,繼續展開或編寫RemotingServices.GetRealProxy(myProxiedObject).Target(循環)是非常繁瑣的。

我拿出兩種解決方案,一種是試圖從在.NET DebuggerTypeProxyAttribute一些幫助,但似乎沒有這樣做,因爲我必須追加該屬性的RealProxy派生類,我真不」不想在Unity中修改InterceptingRealProxy類的源代碼。

另一種方法似乎是可行的,但我扭一流的設計一點。我添加了一個protected readonly屬性調用_rawInstance在我的代理包裹的目標實例的基類,所以我可以看到在我的監視窗口_rawInstance這直接導致我到我原來的未包裝的對象。該代碼可能是這樣的:

public class MyDomainBase : MarshalByRefObject 
{ 
    protected MyDomainBase _rawInstance 
    { 
     get{ return this; } 
    } 

    (... some members, ignored) 
} 

我不知道是否有任何更好的解決這個問題?任何信息或提示將非常感激。

回答

1

你可能想要寫一個可視化工具。它是Visual Studio的一個插件,用於「可視化」任何手錶值,您可以在其中執行任何您想要執行的操作,而不是實際的項目代碼。