IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

AppDomain + Generics : Crash étranges


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut AppDomain + Generics : Crash étranges

    J'ai un problème (remarque, on pouvais le deviner ...). Voici un code :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    interface IGenTest
            {
                void echo_test<T>(T value);
                void echo_test(object value);
            }
     
            class gen_test : MarshalByRefObject, IGenTest
            {
                public virtual void echo_test<T>(T value)
                {
                    Console.WriteLine(value);
                }
                public virtual void echo_test(object value)
                {
                    echo_test<object>(value);
                }
            }
     
            class test : MarshalByRefObject
            {
                public void Test(IGenTest g)
                {
                    g.echo_test<string>("Sample"); //CRASH
                }
            }
     
            static void Main(string[] args)
            {
                {
                    IGenTest g = new gen_test();
     
                    g.echo_test<string>("Sample"); //FONCTIONNE
     
                    AppDomainSetup s = new AppDomainSetup();
                    s.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
                    AppDomain c = AppDomain.CreateDomain("test", null, s);
                    test a = (test)c.CreateInstanceFromAndUnwrap(typeof(test).Assembly.Location, typeof(test).FullName);
                    a.Test(g); //CRASH
     
                    return;
                }
            }
    Dans ce code, si je n'utilise pas un deuxième AppDomain, tout fonctionne correctement. Si je change l'interface IGenTest en ceci :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    interface IGenTest
            {
                void echo_test<T>(T value);
            }
    Tout fonctionne. Mais sans modification, il y a un Crash sur la ligne a.Test(g) qui survient plus précisément sur la ligne "g.echo_test<string>("Sample");" de Test(IGenTest g) avec le message suivant :
    Void echo_test(System.Object) n'est pas un GenericMethodDefinition. MakeGenericMethod peut uniquement être appelé sur une méthode pour laquelle MethodBase.IsGenericMethodDefinition a la valeur true.
    Pourquoi ?

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    As tu essayé d'avoir deux noms de méthode différent pour les méthodes avec generic et sans generic ?

  3. #3
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Bah ça me fait changer beaucoup de choses dans mon code d'origine.
    Cependant echo_test<T> n'est pas la même chose que echo_test. ça reste un bug non ?

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par smyley Voir le message
    Bah ça me fait changer beaucoup de choses dans mon code d'origine.
    ça je m'en fou

    Citation Envoyé par smyley Voir le message
    Cependant echo_test<T> n'est pas la même chose que echo_test. ça reste un bug non ?
    oui . Mais c'est juste pour tester une hypothèse comme quoi les generics ne sont pas correctement transferer dans un appdomain diff

  5. #5
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Encore un autre bug (celui ci me concerne d'avantage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    interface IGenTest
            {
                void echo_test<T>(T value);
                void echo_test<T>(T value, object key);
                void echo_test2(object value);
            }
     
            class gen_test : MarshalByRefObject, IGenTest
            {
                public virtual void echo_test<T>(T value)
                {
                    Console.WriteLine(value);
                }
                public virtual void echo_test2(object value)
                {
                    echo_test<object>(value);
                }
     
                #region IGenTest Membres
     
     
                public void echo_test<T>(T value, object key)
                {
                    //...
                }
     
                #endregion
            }
     
            class test : MarshalByRefObject
            {
                public void Test(IGenTest g)
                {
                    g.echo_test<string>("Sample");
                }
            }
     
            static void Main(string[] args)
            {
                {
                    IGenTest g = new gen_test();
     
                    g.echo_test<string>("Sample");
     
                    AppDomainSetup s = new AppDomainSetup();
                    s.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
                    AppDomain c = AppDomain.CreateDomain("test", null, s);
                    test a = (test)c.CreateInstanceFromAndUnwrap(typeof(test).Assembly.Location, typeof(test).FullName);
                    a.Test(g);
     
                    return;
                }
            }
    Idem, crash sur a.Test(g); avec le message
    L'exception System.NullReferenceException n'a pas été gérée
    Message="La référence d'objet n'est pas définie à une instance d'un objet."
    Source="mscorlib"
    StackTrace:
    Server stack trace:
    à System.Runtime.Remoting.Messaging.MethodCall.ResolveMethod(Boolean bThrowIfNotResolved)
    à System.Runtime.Remoting.Messaging.MethodCall..ctor(SmuggledMethodCallMessage smuggledMsg, ArrayList deserializedArgs)
    à System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
    à System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(Object[] args)
    Exception rethrown at [0]:
    à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
    à System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
    à TestStressing.Program.IGenTest.echo_test[T](T value)
    à TestStressing.Program.test.Test(IGenTest g) dans C:\LKSoft\Applications\MS.Net\DreamShield\DreamShield 2.0\DreamShield.Data\TestStressing\Program.cs:ligne 59
    à TestStressing.Program.test.Test(IGenTest g)
    à TestStressing.Program.Main(String[] args) dans C:\LKSoft\Applications\MS.Net\DreamShield\DreamShield 2.0\DreamShield.Data\TestStressing\Program.cs:ligne 74
    à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
    à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ThreadHelper.ThreadStart()
    InnerException:
    Il n'y a pas de Work Around pour ça sans devoir modifier toutes mes interfaces ?

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par dev01 Voir le message
    As tu essayé d'avoir deux noms de méthode différent pour les méthodes avec generic et sans generic ?
    ps. ça marche mais c'est pas l'idéal, vu que ça me fait tout changer

  7. #7
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Change rien, à part ça :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [Serializable]
    class test
    {
    	public void Test(IGenTest g)
    	{
    		g.echo_test<string>("Sample"); //CRASH
    	}
    }

  8. #8
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Ah tient ça marche
    Donc pour MarshalByRef il crash et Serializable il accepte ...
    Je regarde si c'est applicable à mon projet ...

  9. #9
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    ouais donc bug dans l'implémentation du graph de MarshalByRef ...

Discussions similaires

  1. crash étrange: bug g++?
    Par Freem dans le forum C++
    Réponses: 13
    Dernier message: 08/12/2012, 19h30
  2. Crash étrange d'un QTimer
    Par esteban dans le forum Qt
    Réponses: 9
    Dernier message: 31/10/2012, 16h48
  3. [Generics] Bug étrange du compilateur
    Par nico-pyright(c) dans le forum C++/CLI
    Réponses: 9
    Dernier message: 22/08/2007, 21h24
  4. Crash Base Access
    Par Ronald G. dans le forum Access
    Réponses: 4
    Dernier message: 04/08/2003, 11h55
  5. Fonction étrange
    Par Defrag dans le forum Flash
    Réponses: 3
    Dernier message: 17/07/2003, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo