J'essaie d'utiliser le OpcRcw.da.dll. Si j'interopère cette DLL dans un projet de console de test, tout fonctionne, mais si je construis un projet de DLL pour faire ma gymnastique d'interopérabilité et ajouter ma bibliothèque dans mon projet de console, j'obtiens cette erreur:
L'objet COM qui a été séparé de son RCW sous-jacent ne peut pas être utilisé.
Que faut-il faire pour un projet de bibliothèque de classe pour ne pas tuer la référence RCW?
Il est quelque peu difficile de dire ce que fait votre application réelle, mais il semble que vous instanciez l'objet COM, puis tentez d'y accéder à partir d'un autre thread, peut-être dans un événement Timer.Elapsed. Si votre application est multithread, vous devez instancier l'objet COM dans chaque thread dans lequel vous l'utiliserez.
Cela peut se produire pour plusieurs raisons, les plus importantes que je connaisse sont ci-dessous.
Gestionnaires d'événements sans références fortes au délégué
Un appelant s'abonne à un événement sur l'objet com sans conserver une référence forte au délégué de rappel. Voici un exemple de la façon de le faire correctement et de ne pas le faire: La raison en est qu'une référence forte doit être conservée au délégué, si elle sort du domaine, le wrapper publiera le nombre de références pour l'interface et de mauvaises choses vont arriver.
public class SomeClass
{
private Interop.ComObjectWrapper comObject;
private event ComEventHandler comEventHandler;
public SomeClass()
{
comObject = new Interop.ComObjectWrapper();
// NO - BAD!
comObject.SomeEvent += new ComEventHandler(EventCallback);
// YES - GOOD!
comEventHandler = new ComEventHandler(EventCallback);
comObject.SomeEvent += comEventHandler
}
public void EventCallback()
{
// DO WORK
}
}
Appels vers un wrapper Runtime Callable Wrapper
L'encapsuleur a été supprimé et les appels sont effectués après qu'il a été supprimé. Cela peut se produire généralement si un contrôle utilise un contrôle ActiveX ou un objet COM et que les contrôles Dispose () sont appelés dans le désordre.
étapes de débogage
Un bon moyen de déboguer ce problème est de procéder comme suit:
ne autre chose
Ce n'est pas lié à ce problème, mais tant que nous sommes sur le sujet, sauf indication contraire, n'oubliez pas de vérifier que le thread à partir duquel vos objets COM sont utilisés est marqué STA. Vous pouvez le faire en interrompant le débogueur et en vérifiant la valeur renvoyée par:
Thread.CurrentThread.GetApartmentState();