我在VS 2013中调试一些C#代码时观察到一些奇怪的行为。当我将鼠标悬停在任何作用于当前方法的变量上时,我可以看到该变量的信息。在下面的屏幕截图中,您可以看到ivSimulation已固定并显示信息。然而,即使你无法分辨,我将鼠标移到this._simulator
上并且没有显示任何内容。 QuickWatch也没有显示任何内容。
另一位同事也有同样的问题。我们已经尝试过擦干文件夹并再次获取最新信息。我们还尝试更改VS中的设置(工具 - >选项 - >调试 - >常规 - >使用托管兼容模式)进行检查,但这也没有奏效。显然,这对其他人有用。这在VS 2012中运作得很好。
有什么想法吗?如何在调试器中显示类级变量?
编辑:另一个难题
如果我将鼠标悬停在this
上,我会发现它是一个透明的代理。不知道为什么会这样。
另一篇:
this
指的是派生自ContextBoundObject
的类。我们这样做,所以我们可以使用拦截进行日志记录和异常处理。也许这就是原因。
我错了;这在VS2012中不起作用。也许我以前从未注意过它。
如果我尝试在即时窗口中显示该值,这就是我得到的:
? this._coater.Equipment.Line.Unit.Plant.Site.SiteId无法获取 字段或类型实例上的调用方法 'Company.Mes.Core.Components.Logic.ModuleDerating.StandardDeratingComponentLogic' 因为它是远程对象的代理。
答案 0 :(得分:3)
这是因为this
是透明代理。
以下屏幕截图显示了底部示例代码的问题。
首先创建真实对象并将鼠标悬停在该实例的Name
属性上:
现在为该对象创建一个代理。
注意我将鼠标悬停在实例上以显示它是透明代理。
现在将鼠标悬停在透明代理实例的Name
属性上。
什么都没有出现!透明代理对基础对象的调用进行了巧妙的编组,但IDE显然无法弄清楚,因为返回的代理对象是基于Foo
类的动态生成的类。
输出完整性。
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