Есть задача:
public interface ISomeInfo
{
public string SomeInfo{get;}
}
public class A : ISomeInfo
{
public override string SomeInfo
{
get {return "this is info about class A";}
}
public void MA()
{
}
}
public class B : ISomeInfo
{
public override string SomeInfo
{
get {return "this is info about class A";}
}
public void MB()
{
A a = new A();
a.MA();
}
}
main ()
{
StackTrace ST = new StackTrace( e );
foreach( int i = 0; i < ST.FrameCount; i++ )
{
StackFrame sf = ST.GetFrame( i );
MethodBase mb = sf.GetMethod();
Type ClassType = mb.ReflectedType;
IClassInfo info;
/* вот тут бы мне надо вытянуть обьект класса в котором вызвался метод mb */
if(null != info)
Console.Write("ClassName:"+ClassType.Name+" ClassInfo"+info.SomeInfo);
}
}
от такая вот штучка получается...
Но из сказанного выше мне это скорее всего не реализовать, посему прошу помощи, как бы это реализовать по другому...
С самых общих позиций: забудем про .Net, раскрутим стек windows, есть для этого функции, получим неуправляемый указатель на object, дальше можно его попытаться преобразовать в управляемый, а можно и в сыром выде проанализировать, если очень надо...
Вообще намек на решение этой задачи состоит в существовании отладчика под VS .Net, он ведь умеет и стек раскручивать, и соответствующие управляемые обьекты находить...
вероятно существует какой нибудь DEBUG API
shura
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
N>от такая вот штучка получается...
N>Но из сказанного выше мне это скорее всего не реализовать, посему прошу помощи, как бы это реализовать по другому...
Скорее всего только при помощи CBO. Вот что то типа такого:
public class MyRealProxy : RealProxy
{
private MarshalByRefObject _target;
public MyRealProxy(Type type, MarshalByRefObject target)
{
_target = target;
}
public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg)
{
//
// Тут мы можем положить ссылку на target в CallContext и вызвать метод
//
//
// Подробности по реализации данного метода см. в MSDN-е в описании
// этого метода и в книге MS Press '.NET Remoting'
//
return null;
}
};
[AttributeUsage(AttributeTargets.Class)]
public class MyProxyAttribute : ProxyAttribute
{
public override MarshalByRefObject CreateInstance(Type serverType)
{
MarshalByRefObject target = base.CreateInstance(serverType);
MyRealProxy Proxy = new MyRealProxy(serverType, target);
return (MarshalByRefObject) Proxy.GetTransparentProxy();
}
}
[MyProxy]
class Foo : ContextBoundObject
{
}
Здравствуйте, Tom, Вы писали:
Tom>Tom> [AttributeUsage(AttributeTargets.Class)]
Tom> public class MyProxyAttribute : ProxyAttribute
Tom> {
Tom> public override MarshalByRefObject CreateInstance(Type serverType)
Tom> {
Tom> MarshalByRefObject target = base.CreateInstance(serverType);
Tom> MyRealProxy Proxy = new MyRealProxy(serverType, target);
Tom> return (MarshalByRefObject) Proxy.GetTransparentProxy();
Tom> }
Tom> }
Tom>
Замечу только, что такая реализация прокси объекта не очень устойчика. Ты передаешь в прокси ссылку на реальный объект, который может отвалиться (в этом случае, не известно, что произойдет с вызовом). Почитать про устойчивую реализацию можно сам знаешь где
http://gzip.rsdn.ru/article/dotnet/cntxtvsrealproxy.xmlАвтор(ы): Тимофей Казаков
Дата: 05.06.2004
В статье разбираются тонкости работы с контекстами в .NET. В частности, разбирается класс RealProxy, а также приводятся примеры использования контекстов. Статья является продолжением статьи "Механизмы контекстов в .NET" ( http://www.rsdn.ru/article/dotnet/dotnetcontext.html ) в RSDN Magazine 3'2003.