Ma question est très similaire, sinon replica of this one. Irritablement, la «réponse» ne me donne pas beaucoup de travail et franchement, je suis à bout de souffle.Autorisation refusée - Interface utilisateur de processus croisée utilisant .NET Remoting et FrameworkElementAdapters
Le problème devrait être assez évident. Je souhaite passer des éléments WPF entre processus pour un framework d'application enfichable sans avoir à utiliser Managed AddIn Framework. Je me déploie dans un environnement où la mise en cache de fichiers sur mon disque est inacceptable en raison d'autorisations très restrictives. Ce sont des solutions de contournement - mettre la racine addin dans appdata - mais la structure de répertoire imposée n'est pas souhaitable et ce n'est pas ce que ce dossier est pour autant que je sache.
La méthode est la suivante à l'exception des lignes excepté en caractères gras:
delegate void AddUIElementDelegate(Client client, System.AddIn.Contract.INativeHandleContract handle); private void AddUIElement(Client client, System.AddIn.Contract.INativeHandleContract handle) { if (this.Dispatcher.CheckAccess()) { var element = System.AddIn.Pipeline.FrameworkElementAdapters.ContractToViewAdapter(handle); m_UIElements[client] = element; StackPanel_PluginUIHost.Children.Add(m_UIElements[client]); } else { this.Dispatcher.BeginInvoke(new AddUIElementDelegate(AddUIElement), client, handle); } }
Expérimentation semblait nécessaire que la poignée est démarshalées par FrameworkElementAdapters.ContractToViewAdapter() sur un thread STA, d'où l'appelant. Il convient de noter que client est un rappel MarshalByRefObject et est accédé dans cette méthode via un proxy. handle a également été créé à distance avec un appel à FrameworkElementAdapters.ViewToContractAdapter() et transmis dans ce domaine d'application en tant que valeur de retour d'une méthode distante.
L'exception que je reçois est RemotingException s'est produite - Autorisation refusée: impossible d'appeler des méthodes non publiques ou statiques à distance.
Tous les commentaires sont les bienvenus.
Le problème d'autorisation est seulement potentiel et fait référence à l'accès au disque. CheckAccess() vérifie que le thread sur lequel j'exécute est associé à l'objet dispatcher. Très similaire à InvokeRequired dans WindowsForms. Je suis un peu confus au sujet de ce que je pourrais faire ici qui est illégal étant donné que dans le pipeline MAF, les mêmes appels fonctionnent sans faute. – Gusdor