2010-09-29 25 views
1

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.

Répondre

-1

Le message que vous recevez inclut la possibilité d'appeler une méthode invisible. Extraire les fichiers privés d'un autre assembly (... qui n'a pas l'air correct) n'est pas une opération "safe-type", et effectuer des opérations non-typées nécessite que votre assembly ait la confiance la plus élevée possible: SkipVerification. Non seulement le CLR ne vérifie pas les autorisations pour les tâches "sandbox" normales, il laisse votre code hors du sandbox sans surveillance, et si les flics du système d'exploitation vous arrêtent pour avoir enfreint les règles, c'est votre problème. Puisque vous avez mentionné que le code s'exécute dans un espace d'autorisation très restrictif, je doute que ce soit une option. Vous devriez peut-être revoir les vérifications effectuées par Dispatcher.CheckAccess(). On dirait que vous obtenez un faux positif sur votre capacité à travailler avec le délégué de rappel.

+0

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