еще раз о Call Stack
От: nauro Украина  
Дата: 13.10.04 09:40
Оценка:
Есть задача:

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);
}
}


от такая вот штучка получается...
Но из сказанного выше мне это скорее всего не реализовать, посему прошу помощи, как бы это реализовать по другому...
-----------------------------------------
тут может быть ваша реклама
Re: еще раз о Call Stack
От: nauro Украина  
Дата: 13.10.04 09:46
Оценка:
немного исправлюсь в коде:
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()
{
Test test = new Test();
test.MTest();
}
}
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();
}
}
public class Test
{
public void MTest()
{
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);
}
}
}
main ()
{
B b = new B();
b.MB();
}
-----------------------------------------
тут может быть ваша реклама
еще раз о Call Stack
От: Аноним  
Дата: 13.10.04 10:01
Оценка:
С самых общих позиций: забудем про .Net, раскрутим стек windows, есть для этого функции, получим неуправляемый указатель на object, дальше можно его попытаться преобразовать в управляемый, а можно и в сыром выде проанализировать, если очень надо...

Вообще намек на решение этой задачи состоит в существовании отладчика под VS .Net, он ведь умеет и стек раскручивать, и соответствующие управляемые обьекты находить...
вероятно существует какой нибудь DEBUG API
shura


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: еще раз о Call Stack
От: Tom Россия http://www.RSDN.ru
Дата: 13.10.04 10:08
Оценка:
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
    {
    }
Народная мудрось
всем все никому ничего(с).
Re[2]: еще раз о Call Stack
От: mikа Stock#
Дата: 13.10.04 10:21
Оценка:
Здравствуйте, 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.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.