2009-10-20 8 views
2

J'utilise la lecture de la documentation pour les domaines d'application dans .net 3.5 et rencontré SandboxInterop. Le document indiqueÀ quoi sert la propriété AppDomainSetup.SandboxInterop?

Obtient ou définit une valeur qui indique si la mise en cache d'interface est désactivée pour les appels interopérables dans le domaine d'application, de sorte qu'une interrogation de requête est effectuée à chaque appel.

Mais pourquoi voudrais-je jamais désactiver la mise en cache de QueryInterface?

(Un rapide Google ne trouve pas quelque chose qui explique la manière?)

Répondre

2

En fonctionnement normal, il y a généralement peu de raisons de se soucier des appels QueryInterface être mis en mémoire cache.

Cependant, d'autres parties peuvent créer des composants où le nombre d'interfaces en attente est lié au fonctionnement du composant. En outre, il existe également des valeurs aberrantes dans lesquelles l'interface reçue d'un objet COM a une implémentation qui peut rendre plus difficile le contrôle de la durée de vie de l'objet. Par exemple, les composants écrits en ATL peuvent être créés avec des interfaces tearoff. Ces larmes ne sont pas disponibles dans la mise en page binaire de l'objet principal et sont généralement implémentées sur un autre objet caché qui se coordonne avec son parent. Comme un appel QueryInterface réussi compte implicitement en tant qu'appel AddRef, la durée de vie du fournisseur de suppression peut être étendue au-delà de sa version prévue si la référence de l'interface est mise en cache. En outre, il peut également y avoir un cas où un objet fournit seulement une coupure d'une interface particulière avec l'intention qu'il n'y a qu'un seul consommateur à la fois à travers cette interface. Une copie mise en cache peut enfreindre ce comportement si deux consommateurs reçoivent la même copie lorsque l'intention est que la deuxième demande échoue. Enfin, un scénario plus probable est la possibilité que chaque appel QueryInterface soit suivi à des fins de débogage ou de journalisation. Etre capable de désactiver la mise en cache peut permettre à quelqu'un de diagnostiquer des problèmes où les occurrences pourraient être retardées.

Voici quelques liens sur les interfaces tearoff pour votre référence.

ATL Tear-Off Interfaces @ CodeGuru

CComTearOffObject Class @ MSDN

+0

il en est ainsi pour le débogage et quand l'objet com ne tiennent pas vraiment à la spécification com. De toute façon est-ce au niveau d'un AppDomain, pas par interface com? –

+0

Oui, eh bien, cela devrait s'appliquer à toutes les instances d'objets COM connues dans un AppDomain. Il pourrait être plus succinct de dire que la mise en cache n'est pas un comportement attendu à la suite de l'utilisation d'objets COM, donc ne pas avoir cette option pourrait causer des problèmes d'implémentation en raison d'effets secondaires. – meklarian

Questions connexes