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.
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
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);
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 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; } }
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 :
Pour l'AddIn etc... tout est pareil que dans mon application de teste pourtant sa ne fonctionne pas
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");.
Avez vous une idée du pourquoi du comment de mon problème parce que je n'y comprend plus rien ?
Merci
Partager