2011-08-08 3 views
0

J'ai un serveur COM. Si j'invoque sa méthode dans le style dynamique comme celui-ci, en cas d'un problème de l'autre côté je reçois plein exceptionCOMException dans InteropAssembly COM

try 
{ 
    Type factoryType = Type.GetTypeFromProgID("VPI.TcHost.TcAppFactory"); 

    dynamic factory = Activator.CreateInstance(factoryType);     
    dynamic appl = factory.CreateTcApp("Nga", "8.7");          
} 
catch (COMException ex) 
{ 
    //Here i get nice exception with _FULL_ description message 
} 

Lorsque je crée InteropAssembly et appeler sa méthode comme celui-ci, en cas d'un problème sur l'autre côté je reçois je obtiens court emballage d'exception

try 
{ 
    CTcAppFactory appFactory = new CTcAppFactory(); 
    CNgaApp mApp = appFactory.CreateTcApp("Nga", "8.7"); 
} 
catch (COMException ex) 
{ 
    //Here i get short exception with hex code without Error string that was sent 
    //from COM server 
} 

Cela ressemble à une exception courte. (Il ne contient aucune description du problème que mon serveur COM envoie) Incorrect exception

Comment puis-je obtenir une exception complète dans une variante de code fortement typée?

Répondre

2

DISP_E_EXCEPTION est une erreur COM qui est normalement produite uniquement lorsque vous utilisez le serveur COM en retard. Comme vous l'avez fait dans le premier extrait. Il est étrange qu'il apparaisse dans la version initiale, mais techniquement possible si le serveur COM lui-même utilise une liaison tardive sur un autre type de serveur COM et ne fait que passer le code d'erreur. La couche d'interopérabilité CLR ne va maintenant pas obtenir facilement l'EXCEPINFO de IDispatch :: Invoke(). À moins que le serveur COM implémente correctement IErrorInfo, il semble que ce ne soit pas le cas.

Pas grand-chose que vous puissiez faire à ce sujet, l'auteur semble clairement ne soutenir que les appels tardifs. Contactez-le pour obtenir de l'aide ou retombez en retard.

+0

Merci beaucoup! Très bonne réponse. Je pense que l'implémentation de IErrorInfo au niveau du serveur COM sera une bonne solution. – Grigory

Questions connexes