Pas de domaines d'application dans .NET de Base! Pourquoi?
Est-il une bonne raison pourquoi Microsoft a choisi de ne pas soutenir des domaines d'application dans .NET de Base?
Domaines d'application sont particulièrement utiles lors de la construction de longues serveur en cours d'exécution des applications, où l'on peut mettre à jour les assemblages chargés par le serveur, est un gracieux manière, sans arrêter le serveur.
Sans domaines d'application, comment allons-nous remplacer nos assemblées au long du processus de serveur?
Domaines d'application aussi nous fournir un moyen d'isoler les différentes parties de code serveur. Comme, une coutume serveur websocket peut avoir socket code dans le principal domaine d'application, tandis que nos services sont exécutés dans l'appdomain secondaire.
Sans domaines d'application, le scénario ci-dessus n'est pas possible.
Je peux voir un argument qui peut parler de l'utilisation des ordinateurs virtuels concept de Cloud pour le traitement de l'assemblée des changements et ne pas avoir à payer les frais généraux de domaines d'application. Mais est-ce que Microsoft pense ou dit? ou ils ont une raison particulière et des solutions de rechange pour les scénarios ci-dessus?
- Mais .NET Core 5 n'est pas .NET Framework. C'est pas la version à venir de .NET CLR 4.6 mais une autre chose, alors ne vous inquiétez pas, domaine d'application est là pour rester.
- Je vois, mais si Microsoft est de prétendre que les .NET Core 5 va être multi-plateforme (Windows/Linux/Unix), alors je suis curieux de savoir pourquoi ils veulent supprimer une fonction de noyau comme domaine d'application.
- Je pense (mais c'est juste mon avis) qu'il est plus difficile à mettre en œuvre dans un multi-plateforme manière, ils ralentissent beaucoup de choses et ajouter de la complexité. Pas si beaucoup de gens les utilise (au moins la plupart des gens ne le font pas directement). Si vous n'en avez pas besoin, vous pouvez utiliser .NET de Base. Si vous avez besoin d'eux...ne l'utilise pas (pense ReFS vs NTFS). Tout simplement .NET de Base ne l'est pas .NET avenir (pour l'instant), mais un projet distinct. Peut-être un banc de travail, mais sûrement pas un chemin de migration ou de 1:1 de rechange (au moins maintenant).
- Pensez à ajouter ce que une réponse, car je pense qu'il est utile en tant que tel.
- c'est juste mon avis (2ème commentaire), je pourrais répondre que la communauté wiki, mais je laisse cette tâche à quelqu'un avec un plus à l'aise en anglais!
- Ok. Merci pour vos pensées, bien.
- .NET, le Noyau d'un nouveau concept de "charge de contexte" (ou quelque chose de semblable), c'est-à
IDisposable
. Il vous permet de vous décharger des assemblées de cette façon, sans l'forcée limites que vous obtenez à partir de l'app domaines. - Je suis intéressé à en savoir plus à propos de "charger contexte". Pouvez-vous donner des précisions, si vous avez plus d'info? Sans doute cela a quelques réponses à ma question.
- Parce que vous ne pouvez pas le modèle le concept d'un Domaine de l'Application sur Linux et Mac OS. Sur windows App Domaines sont profondément liée à la notion de Processus, DACL, Ace, Listes de Contrôle d'Accès, etc, etc, etc... de Ces choses n'existent pas sous Linux/MacOs... Que et autant que je sache, sur linux, il est en cours d'exécution sur Xarmarin (Mono) et je ne suis pas sûr de savoir comment il compile le MSIL et pour quoi, mais je pari que c'est pas du code Machine Natif.
Vous devez vous connecter pour publier un commentaire.
Le point de la .NETCore sous-ensemble a été de garder un .NET installer petit. Et facile à porter. C'est pourquoi vous pouvez, dire, d'exécuter une application Silverlight sur Windows et OSX, et ne pas attendre très longtemps quand vous visitez la page web. Le téléchargement et l'installation complète de l'exécution et prend une poignée de secondes, donner ou prendre.
Garder les petits qui exige inévitablement des fonctionnalités à couper. L'accès distant est très élevé sur cette liste, c'est assez cher. Sinon, bien caché, mais vous pouvez voir, par exemple, que les délégués n'ont plus fonctionnel BeginInvoke() la méthode. Qui a mis AppDomain sur la liste des pièces soudées ainsi, vous ne pouvez pas exécuter du code dans une application de domaine sans remoting soutien. C'est donc entièrement à la conception.
Mise à jour .NET Standard 2 et .NET Core 2
Dans .NET Standard 2 la
AppDomain
classe est là. Cependant, de nombreuses parties de l'API va jeter unPlatformNotSupportedException
pour .NET de Base.La principale raison pour laquelle il est toujours là, est pour les trucs de base comme l'enregistrement d'un gestionnaire d'exceptions non gérées qui sera travail.
L' .NET Standard FAQ a cette explication:
En dehors de cela, la réponse sommet et les autres réponses aussi bien expliquer pourquoi la majeure partie du domaine d'application était encore coupée (par exemple, jette un non pris en charge exception).
App Domaines
Pourquoi était-il interrompu? Domaines d'application nécessite le support d'exécution et sont généralement assez chers. Tout en encore mis en œuvre par CoreCLR, il n'est pas disponible .NET Native et nous n'avons pas l'intention d'ajouter cette capacité là.
Que dois-je utiliser à la place? Domaines d'application sont utilisés à différentes fins. Pour le code de l'isolement, nous vous recommandons de processus et/ou les conteneurs. Pour le chargement dynamique des assemblages, nous vous recommandons de la nouvelle AssemblyLoadContext classe.
De la Source à Partir de MSDN Blog
For code isolation, we recommend processes and/or containers
... Est-il un conteneur api disponible dans .net de base?À un moment donné, j'ai entendu dire que le déchargement des assemblages serait activé sans l'aide de domaines. Je pense que le
System.Runtime.Loader.AssemblyLoadContext
type dans System.Runtime.Loader.dll est liée à ce travail, mais je ne vois rien là qui permet le déchargement encore.Que j'ai entendu dans une communauté standup ou certains parlent de Microsoft que la fonction d'isolation de domaines d'application sont mieux traitées par les processus (et en fait le modèle courant dans les autres plates-formes) et le déchargement est, en effet, prévu comme une caractéristique normale non liées à des domaines d'application.