2010-09-10 11 views
2

J'ai déclaré une classe COM visible en C#. Le code est le suivant:C# Classe COM - DISP_E_UNKNOWNNAME

[ComVisible(true)] 
public class AComVisibleClass : TheParentClass 
{ 
    public bool SomeFunc(string id) 
    { 
     return true; 
    } 

} 

Cette classe est instanciée par une classe d'usine, également accessible COM par.

Mais si j'essaie d'accéder à un fichier de script VB, une exception DISP_E_UNKNOWNNAME est levée.

Ceci est une nouvelle classe sur une bibliothèque préexistante que nous avons ici au travail. Toutes les autres classes sont accessibles via COM. La bibliothèque entière est compilée dans un seul fichier d'assemblage. J'ai enregistré le nouvel assembly en utilisant regasm, mais j'ai toujours cette exception.

J'ai essayé de déboguer l'appel COM en utilisant VS2008. La classe d'usine semble être en mesure d'instancier le AComVisibleClass. L'exception susmentionnée est levée uniquement lorsque l'usine essaie d'exécuter SomeFunc.

Je sais que cela peut sembler un peu (?) Peu vague, mais je ne peux pas exposer le vrai code ici. Si quelqu'un a besoin de plus d'informations, s'il vous plaît demandez-moi.

+0

Pouvez-vous ajouter votre code VBScript (juste assez pour voir à quoi ressemble l'appel)? –

+0

Le problème est dans le code VBScript. Vous n'avez pas publié ce code. –

Répondre

4

Je peux penser à trois raisons possibles de ce problème:

Raison 1: Mauvais nom utilisé dans CreateObject:

Je suppose que votre code VBScript appelle quelque chose comme ceci:

Set obj = CreateObject("MyLibrary.AComVisibleClass") 

Si cela est correct, ouvrez l'éditeur de registre et vérifiez si la clé HKEY_CLASSES_ROOT contient une sous-clé appelée MyLibrary.AComVisibleClass. Si ce n'est pas le cas, le nom de votre bibliothèque est peut-être différent de ce que vous attendiez. Recherchez dans le registre AComVisibleClass pour trouver le nom de bibliothèque correct.

Raison n ° 2: problèmes 64 bits:

Si le problème se produit sur un système d'exploitation 64 bits, la raison pourrait être que votre VBScript fonctionne comme un processus 32 bits et le C# COM DLL est 64 bits ou vice versa.

Raison n ° 3: Nom de fonction incorrect:

Vous utilisez peut-être un mauvais nom de fonction dans le script, par exemple obj.SomeFnc(1) au lieu de obj.SomeFunc(1), ou le nom de la fonction que vous avez choisi est un mot clé réservé dans VBScript ou contient des caractères inhabituels.

+0

J'ai été capable de découvrir ce qui se passait. Tout ce que je peux dire, c'est que mon problème était un peu plus complexe que celui que j'ai décrit ici ... MAIS c'est la réponse la plus utile, et ainsi sera acceptée. – rsenna

0

Semble que vous devez prendre en charge IDispatch.

Découvrez Does C# .NET support IDispatch late binding?

modifier

Cette réponse est probablement fausse, et je peux encore liquider le supprimer. Pour l'instant, il semble ajouter de la valeur, alors je vais le laisser rester.

+0

.NET expose les interfaces doubles (c'est-à-dire y compris IDispatch) par défaut pour les éléments ComVisible, ce qui ne devrait pas être le problème ici. –

+0

@Pavel, vous avez raison. Il semble que 'IDispatch' soit implémenté mais que l'appelant ne passe pas le bon nom. (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.disp_e_unknownname(VS.80).aspx) Pourrait-il être sensible à la casse? –