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é System.AddIn par MEF. dans mon application de teste tout roule
si je colle tout simplement le même code dans mon autre application rien de fonctionne je ne comprend pas d'où vient le problème. Voici mon code teste.
class Teste<T>
{ [Import
]// attribut marquant une propriété importée depuis les addins découverts public IEnumerable<T> Operations
{get;
privateset;
} private Dictionary<string, List<string>> m_PluginsArray =
new Dictionary<string, List<string>>
() { {"AddinHttp",
new List<string>
(){"http",
"https"}} };
publicvoid 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;
} } returndefault(T
);
} } class Program
{ staticvoid 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:
publicinterface 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 :
[Export(typeof(IProtocol))]
publicclass AddinHttp : IProtocol
{
#region IProtocol Membres
publicstring 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 :
namespace WebCrawler
{ class Teste<T>
{ [Import
]// attribut marquant une propriété importée depuis les addins découverts public IEnumerable<T> Operations
{get;
privateset;
} private Dictionary<string, List<string>> m_PluginsArray =
new Dictionary<string, List<string>>
() { {"AddinsHttp",
new List<string>
(){"http",
"https"}} };
publicvoid 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;
} } returndefault(T
);
} } class Program : BlueCurve.
Common.
InteractiveConsole.
BaseConsole { #region 'Functions' staticvoid 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 .