2010-06-28 5 views
5

J'ai un problème plutôt étrange. J'exporte une interface d'une bibliothèque C# vers COM. J'ai activé le paramètre de projet 'register with COM', donc il appelle tlbexp.exe pour faire le type libs.tlbexp.exe modifie le cas des noms de méthode

Nous utilisons cas de chameau sur nos noms de méthode et je remarque que la bibliothèque de type exporté change ces toute méthode qui arrive à coïncider avec un nom de classe à l'autre Pascal ...

par exemple

interface IFoo 
{ 
void randomClass() 
} 

class RandomClass 
{ 
} 

Le IFoo exporté dans le type lib définit IFoo-> RandomClass() au lieu de IFoo-> randomClass()

Des idées sur ce qui cause cela et comment l'arrêter?

Répondre

6

Comme COM est insensible à la casse, "RandomClass" et "randomClass" sont le même symbole dans la table de la bibliothèque de sortie. (C'est en partie la raison pour laquelle les directives .NET recommandent PascalCasing pour les noms de classe et les méthodes.)

Celui qui sera choisi sera le premier que le compilateur émet, et ceci est assez non déterministe du point de vue du programmeur. de vue!

Vous pouvez choisir l'un ou l'autre, en utilisant le paramètre /names de TlbExp, mais les deux boîtiers ne peut pas coexister dans la bibliothèque.

Pour utiliser le fichier, vous créez simplement un fichier de noms de TlbExp avec une liste d'identifiants, une par ligne:

RandomClass 
SomeOtherIdentifier 

Ensuite, vous l'appelez comme ceci:

tlbexp MyAssembly.dll /names=MyNames.txt 

TlbExp utilisera alors la version du symbole définie dans le fichier de noms.

+0

Merci! Je n'ai jamais su à ce sujet. – ljbade

+0

Existe-t-il un moyen d'utiliser Regasm pour utiliser/names quand il le fait/tlb? – Squirrel

+0

@Squirrel: Pas que je sache. – porges

Questions connexes