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

C# Discussion :

Probème de détection AddIn incompréhensible


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut Probème de détection AddIn incompréhensible
    Bonjour,

    J'ai posté il a plusieurs jours un message concernant mes problèmes avec System.AddIn. Après avoir retourné et lu 50 fois mon code je n'ai rien trouvé de louche. J'ai donc décidé d'en avoir le coeur net et j'ai changé Systam.AddIn par MEF. dans mon application de teste tout roule
    si je colle tout simplement le meme code dans mon autre application rien de fonctionne je ne comprend pas d'ou vient le problème. Voici mon code teste.
    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
    55
     
     
        class Teste<T>
        {
            [Import] // attribut marquant une propriété importée depuis les addins découverts
            public IEnumerable<T> Operations { get; private set; }
            private Dictionary<string, List<string>> m_PluginsArray = new Dictionary<string, List<string>>()
            {
                { "AddinHttp", new List<string>() { "http", "https" } }
            };
            public void Compose()
            {
                // création du catalogue. Les addins sont dans le répertoire de l'exe
                DirectoryPartCatalog catalog = new DirectoryPartCatalog(@"Addins", true);
                // créé le conteneur
                CompositionContainer container = new CompositionContainer(catalog.CreateResolver());
                // ajoute this pour qu'il puisse être lié via ses attributs 'import'
                container.AddPart(this);
                // réalise la composition (connexion de tous les exports à tous les imports)
                container.Compose();
            }
     
            public T GetAddInToken(string key)
            {
                var x = from v in m_PluginsArray
                        where v.Value.Contains(key)
                        select v.Key;
     
                foreach (string addinName in x)
                {
                    foreach (T _token in Operations)
                    {
                        if (_token.GetType().Name.Equals(addinName))
                            return _token;
                    }  
                }
     
                return default(T);
            }
        }
     
        class Program
        {
     
            static void Main(string[] args)
            {
               Teste<IProtocol> T = new Teste<IProtocol>();
               T.Compose();
               Stopwatch w = new Stopwatch();
               w.Start();
               IProtocol operation = T.GetAddInToken("http");
               Console.WriteLine(w.ElapsedMilliseconds + "ms");
               w.Stop();
               RequestState r = operation.Download(null, null, null);
               Console.WriteLine(">> " + r.Extension);
    T est le type d'AddIn que je souhaite chargé ici ceux qui implémente l'interface IProtocol que voila:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public interface IProtocol
        {
            RequestState Download(Attributes<string, int, DateTime, DateTime, int, string, string> downloadata, X509Certificate[] certificates, X509Certificate[] certificates2);
            IEnumerable Download(Attributes<string, int, DateTime, DateTime, int, string, string> downloadata, X509Certificate[] certificates, X509Certificate[] certificates2, bool n);
            string Accept { get; set; }
            Uri Proxy { get; set; }
        }
    et mon Addin de teste que voila :
    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
     
     
        [Export(typeof(IProtocol))]
        public class AddinHttp : IProtocol
        {
            #region IProtocol Membres
            public string Accept { get; set; }
            public Uri Proxy { get; set; }
     
            public RequestState Download(Attributes<string, int, DateTime, DateTime, int, string, string> downloadata, X509Certificate[] certificates, X509Certificate[] certificates2)
            {
                return (new RequestState() { Extension = "Hello" });
            }
            public IEnumerable Download(Attributes<string, int, DateTime, DateTime, int, string, string> downloadata, X509Certificate[] certificates, X509Certificate[] certificates2, bool n)
            {
                yield return (new RequestState() { Extension = "Hello" });
            }
     
            #endregion
        }


    Bref de l'ultra simple pour teste ce code fonctionne niquel rien à redire.


    Maintenant pour voir d'ou vient mon souci j'ai tout simplement copie/collé la classe Teste<t> dans mon web crawler. Implementer IProtocol dans mon seul et unique AddIn pour le moment.

    Mais la parcontre rien ne fonctionne voici mon code :
    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
    55
    56
     
     
    namespace WebCrawler
    {
        class Teste<T>
        {
            [Import] // attribut marquant une propriété importée depuis les addins découverts
            public IEnumerable<T> Operations { get; private set; }
            private Dictionary<string, List<string>> m_PluginsArray = new Dictionary<string, List<string>>()
            {
                { "AddinsHttp", new List<string>() { "http", "https" } }
            };
            public void Compose()
            {
                // création du catalogue. Les addins sont dans le répertoire de l'exe
                DirectoryPartCatalog catalog = new DirectoryPartCatalog(@"AddIns", true);
                // créé le conteneur
                CompositionContainer container = new CompositionContainer(catalog.CreateResolver());
                // ajoute this pour qu'il puisse être lié via ses attributs 'import'
                container.AddPart(this);
                // réalise la composition (connexion de tous les exports à tous les imports)
                container.Compose();
            }
            public T GetAddInToken(string key)
            {
                var x = from v in m_PluginsArray
                        where v.Value.Contains(key)
                        select v.Key;
                foreach (string addinName in x)
                {
                    foreach (T _token in Operations)
                    {
                        if (_token.GetType().Name.Equals(addinName))
                            return _token;
                    }
                }
                return default(T);
            }
        }
     
        class Program : BlueCurve.Common.InteractiveConsole.BaseConsole
        {
            #region 'Functions'
            static void Main(string[] argv)
            {
                // Création du répertoire de sauvegarde
                if (!Directory.Exists(ConfigurationManager.AppSettings["DownloadedFilesDestination"]))
                    Directory.CreateDirectory(ConfigurationManager.AppSettings["DownloadedFilesDestination"]);
     
                Teste<IProtocol> m = new Teste<IProtocol>();
                  m.Compose();
                BlueCurve.Plugins.IProtocol e = m.GetAddInToken("http");
                if (e != null)
                    Console.WriteLine("ok");
                else
                    Console.WriteLine("null");
    Pour l'AddIn etc... tout est pareil que dans mon application de teste pourtant sa ne fonctionne pas .

    Avez vous une idée du pourquoi du comment de mon problème parce que je n'y comprend plus rien ?


    Merci

  2. #2
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut
    Alors voila j'ai fini par trouvé pourquoi mes plugins n'étaient pas détecté il faut en fait si vous utilisez des libs externe les enregistrer dans le GAC afin que le system d'AddIn les trouvent. J'ai suer comme un malade mais j'ai fini par trouvé, c'est étrange qu'aucun tuto ne mentionne cela.

    Maintenant j'ai un autre souci qui n'a rienà avoir System.AddIn me lance une erreur TypeLoadException en me disant que la méthod Download de mon plugin n'a pas d'implémentation . Chose plutot étrange...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Une exception non gérée du type 'System.TypeLoadException' s'est produite dans System.AddIn.dll
    Informations supplémentaires : La méthode 'Download' du type 'Addins.Http.AddinsHttp' de l'assembly 'Addins.Http, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' n'a pas d'implémentation.

  3. #3
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut
    Voila j'ai trouvé ma dernière erreur j'avais mal enregistré une dll bon tout roule.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/11/2008, 14h27
  2. [WSAD5] probleme incompréhensible
    Par capitaine_banane dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 07/04/2004, 11h56
  3. Détection MySql
    Par gjullien dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/08/2003, 18h15
  4. Détections avec WebBrowser
    Par Wazo_Sportive dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/08/2002, 19h32
  5. Détection de 2 touches appuyées
    Par cyrose dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 16h25

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