在Visual Studio 2013中进行调试时无法看到类级变量

时间:2014-03-07 17:56:02

标签: c# debugging visual-studio-2013

我在VS 2013中调试一些C#代码时观察到一些奇怪的行为。当我将鼠标悬停在任何作用于当前方法的变量上时,我可以看到该变量的信息。在下面的屏幕截图中,您可以看到ivSimulation已固定并显示信息。然而,即使你无法分辨,我将鼠标移到this._simulator上并且没有显示任何内容。 QuickWatch也没有显示任何内容。

enter image description here

另一位同事也有同样的问题。我们已经尝试过擦干文件夹并再次获取最新信息。我们还尝试更改VS中的设置(工具 - >选项 - >调试 - >常规 - >使用托管兼容模式)进行检查,但这也没有奏效。显然,这对其他人有用。这在VS 2012中运作得很好。

有什么想法吗?如何在调试器中显示类级变量?

编辑:另一个难题

如果我将鼠标悬停在this上,我会发现它是一个透明的代理。不知道为什么会这样。

enter image description here

另一篇:

this指的是派生自ContextBoundObject的类。我们这样做,所以我们可以使用拦截进行日志记录和异常处理。也许这就是原因。

我错了;这在VS2012中不起作用。也许我以前从未注意过它。

如果我尝试在即时窗口中显示该值,这就是我得到的:

  

? this._coater.Equipment.Line.Unit.Plant.Site.SiteId无法获取   字段或类型实例上的调用方法   'Company.Mes.Core.Components.Logic.ModuleDerating.StandardDeratingComponentLogic'   因为它是远程对象的代理。

2 个答案:

答案 0 :(得分:3)

这是因为this是透明代理。

以下屏幕截图显示了底部示例代码的问题。

首先创建真实对象并将鼠标悬停在该实例的Name属性上:

enter image description here

现在为该对象创建一个代理。 enter image description here

注意我将鼠标悬停在实例上以显示它是透明代理。

现在将鼠标悬停在透明代理实例的Name属性上。 enter image description here

什么都没有出现!透明代理对基础对象的调用进行了巧妙的编组,但IDE显然无法弄清楚,因为返回的代理对象是基于Foo类的动态生成的类。

输出完整性。

enter image description here

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Text;

namespace ConsoleApplication27
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo foo = new Foo(){ Name = "My Foo1" };

            Console.WriteLine(foo.Name);

            FooProxy fooProxy = new FooProxy(foo);

            Foo proxiedFoo = (Foo)fooProxy.GetTransparentProxy();

            Console.WriteLine(proxiedFoo.Name);
        }
    }

    public class Foo : MarshalByRefObject
    {
        public string Name { get; set; }
    }

    public class FooProxy 
        : RealProxy
    {
        private Foo _target;

        public FooProxy(Foo target) : base(typeof(Foo))
        {
            this._target = target;
        }

        public override IMessage Invoke(IMessage msg)
        {
            return InvokeRemoteCall((IMethodCallMessage)msg, this._target);
        }

        /// <summary>
        /// Invokes the remote call.
        /// </summary>
        /// <param name="methodCall">The method call.</param>
        /// <param name="target">The target.</param>
        /// <returns>A <see cref="ReturnMessage"/></returns>
        private static IMessage InvokeRemoteCall(IMethodCallMessage methodCall, object target)
        {
            MethodInfo method = methodCall.MethodBase as MethodInfo;

            object callResult = (target != null) ? method.Invoke(target, methodCall.InArgs) : null;

            LogicalCallContext context = methodCall.LogicalCallContext;

            var query = method.GetParameters().Where(param => ((ParameterInfo)param).IsOut);

            ParameterInfo[] outParameters = query.ToArray();

            return new ReturnMessage(callResult, outParameters, outParameters.Count(), context, methodCall);
        } 
    }
}

答案 1 :(得分:0)

可能是* this._simulator *已分配但尚未在任何地方(尚未)使用,因此调试器会对此进行优化而不显示这些变量。

如果是这种情况,只需在分配后尝试使用ToString()方法,然后在其后面加上断点。

...
this._simulator = GetEquipment(ivSimulation);
this._simulator.ToString();
//Another line with the break point here