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:
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:
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:
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:
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 8O.
Avez vous une idée du pourquoi du comment de mon problème parce que je n'y comprend plus rien ?
Merci