Si vous créez votre objet COM STA sur un thread .NET STA, tous les appels à votre objet sont rassemblés sur ce thread.
Si vous créez votre objet STA COM sur un thread MTA .NET, le moteur d'exécution créera un thread STA et dirigera tous les appels vers ce thread. Ainsi, lorsque votre thread (STA) existe, vos objets COM sont inaccessibles.
Une solution pourrait être de créer les objets sur un nouveau thread pour lequel vous pouvez contrôler la durée de vie.
Je l'ai fait une chose semblable comme ça:
using (ManualResetEventSlim mre = new ManualResetEventSlim(false))
{
Thread _STAThread = new Thread(new ThreadStart(() =>
{
globalComObject = new ComClass();
mre.Set();
try
{
Thread.CurrentThread.Join();
}
catch (ThreadAbortException)
{
}
}));
_STAThread.SetApartmentState(ApartmentState.STA);
_STAThread.IsBackground = true;
_STAThread.Start();
mre.Wait();
}
Le code commence un nouveau thread, mettre l'appartement à STA et attend la création d'un objet COM sur ce thread. Le thread lui-même est en cours d'exécution jusqu'à ce que votre application se ferme (IsBackground = true) ou vous supprimez le thread explicitement avec Thread.Abort(). Mais gardez à l'esprit que tous les appels à vos objets COM sont rassemblés et ainsi exécutés en série l'un après l'autre sur ce même thread. Cela pourrait être un gros goulot d'étranglement dans votre application. ASPCompat = true indique à l'environnement d'exécution ASP.NET que vous utilisez des objets COM STA et exécute ainsi la page dans un thread STA. sinon vous migth obtenez une exception ou tous vos objets COM courrez dans le thread STA généré automatiquement partagé par toutes demandes de votre page (voir MSDN ici: http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx)
Donc, cela veut dire que si j'utilise ASPCompat et mettre COM objets dans la session, ils vont mourir au hasard parce que le fil qui les a créés aura fini ?? –
Je pense que non, car ASP.NET utilise un pool de threads pour gérer les requêtes. Les threads ne "mourront" pas après le traitement d'une requête. Consultez ces articles de la base de connaissances dans lesquels Microsoft indique qu'il est possible de stocker des objets COM STA dans l'état de session, mais recommande de ne pas y accéder: http://support.microsoft.com/kb/243543/fr-fr, http://support.microsoft .com/kb/243815/fr-fr – Jan