Meilleur auteur de réponses
IoT et chargement d'assembly, possible ?

Question
-
Bonjour à tous,
Je cherche désespérément un moyen de charger des dll dans une application UWP destinée à être installée sur un raspberry pi 3 (avec un socle windows 10 IoT).
Seul problème, c'est que j'ai l'impression qu'on ne peut pas vraiment charger de dll exterieure comme on peut le faire avec la reflection, MEF ou MAF à cause de leurs restrictions de sécurité (pour le coup, merci les systèmes fermés... Si j'ai envie de le faire, je peux en prendre la responsabilité...).
Bref, je cherche un moyen de créer un système à base de plugins sur un windows 10 IoT. Si vous avez une idée, n'hésitez pas à m'en faire part ;)
Réponses
-
Bonjour,
Au temps pour moi, je vous ai fais perdre un peu de temps.
En réalité, vous pouvez utiliser Prism.Unity.
J'avais l'habitude d'utiliser Unity en config (configuration en design time). Malheureusement cela n'est pas disponible pour UWP c'est sûrement la même raison qui fait que nous n'avons pas Prism.MEF et que vous ne pouvez pas loader des assemblies comme bon vous semble.
Microsoft semble cependant travailler dessus...
Bref, actuellement je n'ai pas vraiment de solution à vous proposer finalement or mis créer votre package NuGet pour vos librairies et le mettre en référence dans votre projet.
Kevin BEAUGRAND, Modis FRANCE
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.- Modifié BEAUGRAND Kevin lundi 25 avril 2016 09:33
- Proposé comme réponse BEAUGRAND Kevin lundi 25 avril 2016 13:05
- Marqué comme réponse insomniak49 lundi 25 avril 2016 16:31
Toutes les réponses
-
Bonjour, insomniak49,
Veuillez consulter l'article en bas (partie Tips for developing with .NET Native) :
Universal Windows apps in .NET
Je vous remercie par avance de votre retour.Cordialement,
TeodoraVotez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.
-
Bonjour Teodora,
Malheureusement, je ne parlais pas de dll natives, mais bien de dll CLR .Net, des class library standard (pour aller plus loin, je dirais même des UWP Class Library, donc on ne peut pas être plus proche du projet hôte en terme de framework).
De ce que j'ai pu comprendre, c'est une limitation du framework UWP qui ferme toutes les portes habituelles (celles dont on pouvait se servir en framework .Net standard comme dans les applications winforms, WPF ou sites ASP MVC).
Au même titre que les capabilities dans les UWP, Microsoft a décidé de brider au maximum les possibilités pour soi disant améliorer la sécurité des applications livrées sur le store. Or, force est de constater que la couche UWP est le futur de .Net puisqu'ils se veulent multiplateformes et compagnie. Sauf qu'en faisant ça, ils enlevent toutes les possibilités que les développeurs avaient auparavant.
Exemple concret : on pouvait piloter l'allumage ou l'extinction de l'écran connecté au device sur n'importe quelle appli. Maintenant, avec UWP, on ne peut plus. Avant, je pouvais charger mes plugins (codés par mes soins dans le même framework que l'applicatif hôte) par le biais de l'objet Assembly (Assembly.LoadFrom en spécifiant le chemin de la DLL) maintenant on ne peut plus qu'utiliser Assembly.Load qui attend le namespace complet du type qu'on veut charger ce qui sous entend qu'il faut que la DLL soit déjà intégrée au projet (donc aucune modularité possible puisqu'on doit obligatoirement compiler le projet hote avec les plugins qu'on souhaite charger). MEF et MAF ont disparu. J'ai bien essayé avec Microsoft.Composition mais ça ne passe pas non plus.
Pourtant ce que je souhaite faire reste dans le B-A BA des applis modulaires avec plugins :
1 projet Hote (en UWP)
N projets Plugins (en UWP class library)
Le projet hote va chercher la liste de DLL présentes dans le repertoire plugins puis les charge une à une dans l'application hote. Ca se fait tout seul sur les autres couches .Net et pas du tout sur celle là.
Pour résumer, Microsoft a bridé les quelques fonctionnalités qui rendaient tout le système intéressant si tant est qu'on ne développe pas une application simple.
Si vous avez la possibilité de communiquer ce message à quiconque travaillant sur le socle UWP, je serais plus que ravi de converser avec pour lui donner mon avis car je pense que beaucoup (que dis-je, enormément) de personnes se détourneront du framework .Net à cause de ça quand ils retireront définitivement les anciennes couches applicatives. Même chose pour Windows 10 IoT qui s'appuie aussi sur UWP. Personnellement, je travaille avec .Net depuis 10 ans et je commence à avoir de sérieux doutes quant à la pérennité de ce framework.
Cordialement,
Steeve
-
Bonjour Steeve,
Effectivement Microsoft a beaucoup brider les développeurs pour leur nouvelle plateforme et vous pouvez y voir un mal.
Leur justification est double:
- Améliorer les performances et la sécurité,
- Redonner aux utilisateur la confiance en leur plateforme.
Microsoft tente d'utiliser toutes les stratégies pour convaincre les développeurs et les utilisateurs du bien fondé de leurs actions. Pour ma part j'y crois, et sûrement que d'autres personnes pourrons vous donner plus d'arguments qui vous aiderons à penser que ce n'est pas un grand mal...
En disant cela je ne résous pas votre problème. Cependant, si vous avez l'habitude de développer des applications modulaires, vous avez sûrement dû croiser la route de quelques framework qui permettent d'aider à ce type de développement.
En UWP je peux vous conseiller notamment Prism qui se chargera de loader vos assembly comme un grand et qui fonctionne très bien sur UWP.
Cordialement,
Kevin BEAUGRAND, Modis FRANCE
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème. -
Bonjour Kevin,
Merci pour la réponse. Je n'entrerai pas dans le débat du tout sécuritaire, on sait ou ça mène et d'autres fonctionnent très bien sans (linux? qui a dit linux ? ^^ ou mac os aussi). Bref.
Concernant Prism, je dois avouer que je n'ai même pas osé tenter! Honnêtement, pour moi, qu'on ne puisse pas utiliser Assembly.LoadFrom ni MEF ni MAF, je n'aurais jamais pensé ni même tenté d'utiliser une lib non Microsoft...
Vous êtes franchement sur de chez sur que cela fonctionne sur un UWP ? Pour info, je compile en ARM (Raspberry), ça a peut être son importance.
Merci pour la piste en tout cas, je reviendrai donner le verdict dès que j'aurais testé !
-
Bonjour Steeve,
Je vous confirme que cela fonctionne. Nous l'utilisons pour développer des applications UWP et plus largement depuis quelques années pour des applications WPF.
P.I : Prism est issu des Microsoft Pattern and Practices...
Assurez-vous juste de prendre le package Prism.Windows qui est celui qui fonctionne sur UWP.
Plus d'infos sur : https://github.com/PrismLibrary/Prism
Cordialement,
Kevin BEAUGRAND, Modis FRANCE
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.- Modifié BEAUGRAND Kevin mardi 19 avril 2016 06:35
-
Bonjour Kévin,
Encore merci pour ces infos. Je viens de faire quelques essais mais il y a un truc qui doit m'échapper je pense.
Sur les différents tutos (qui d'ailleurs ne sont pas si triviaux que ça) je constate que Prism s'appuie sur MEF ou Unity pour le chargement modulaire. Par contre, je ne trouve aucun exemple pour UWP et du coup je rame un peu...Je vois beaucoup d'exemples qui utilisent l'interface IModule mais je n'ai pas de package avec cette interface. Même chose pour les annotations Module.
L'utilisation du package Prism.Windows seul suffit ou bien il faut utiliser autre chose à coté ?
- Modifié insomniak49 dimanche 24 avril 2016 16:17 précisions
-
Bonjour Steeve,
Avez-vous jeté un coups d’œil sur les samples fournis sur github ?
https://github.com/PrismLibrary/Prism-Samples-Windows
Cela peut déjà vous aider sur l'implémentation de Prism en UWP.
Cordialement,
Kevin BEAUGRAND, Modis FRANCE
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème. -
Bonjour,
Oui j'ai testé ces samples mais je n'ai pas vu la partie "plugin" dans ces exemples (ou alors je suis très mal réveillé).
SplitViewSample et ExtendedSplashScreenDemo n'ont pas de projet type class library supplémentaire (il n'y a qu'un projet) donc je présume qu'il n'y a pas chargement de dll de plugin.
Dans le projet AdventureWorks.Shopper, il y a bien le projet AdventureWorks.UILogic en plus du projet de démarrage mais celui ci est présent dans les références du projet de démarrage, ce qui sous entend que ce n'est pas un chargement dynamique de DLL.
J'ai également téléchargé les samples de Prism 5.1 dans lesquels je retrouve bien une trace de "plugins" dont les projets ne sont pas référencés dans le projet de démarrage et donc sont chargés dynamiquement. Par contre, ce n'est pas le même framework et donc je n'ai pas accès aux mêmes classes via UWP.
J'ai eu beau creuser, je n'ai pas trouvé. Je suis surement passé à côté de quelque chose mais je ne vois pas quoi.
-
Bonjour,
Au temps pour moi, je vous ai fais perdre un peu de temps.
En réalité, vous pouvez utiliser Prism.Unity.
J'avais l'habitude d'utiliser Unity en config (configuration en design time). Malheureusement cela n'est pas disponible pour UWP c'est sûrement la même raison qui fait que nous n'avons pas Prism.MEF et que vous ne pouvez pas loader des assemblies comme bon vous semble.
Microsoft semble cependant travailler dessus...
Bref, actuellement je n'ai pas vraiment de solution à vous proposer finalement or mis créer votre package NuGet pour vos librairies et le mettre en référence dans votre projet.
Kevin BEAUGRAND, Modis FRANCE
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.- Modifié BEAUGRAND Kevin lundi 25 avril 2016 09:33
- Proposé comme réponse BEAUGRAND Kevin lundi 25 avril 2016 13:05
- Marqué comme réponse insomniak49 lundi 25 avril 2016 16:31
-
C'est bien ce dont j'avais peur :(
Pour l'instant, j'ai préparé tous mes plugins avec référence directe dans l'appli mais tout en ayant une archi prete à l'emploi pour du load déporté. Je verrais bien quand il y aura une amélioration sur ce point.
Merci d'avoir pris le temps en tout cas.
-
Par contre, je rebondis sur une derniere question : quand vous dites "Microsoft semble cependant travailler dessus..." y'a-t-il une page qui traite de ce travail ? quelque part ou je pourrais à minima voir ce qu'ils cherchent à faire, le nom de ce framework histoire de pouvoir suivre ça de pres :)
merci d'avance