2010-06-28 13 views
5

Ho un problema piuttosto strano. Sto esportando un'interfaccia da una libreria C# a COM. Ho abilitato l'impostazione del progetto 'registra con COM', quindi chiama tlbexp.exe per creare il tipo libs.tlbexp.exe cambia il nome dei nomi caso

Usiamo caso cammello su nostri nomi di metodo e ho notato che la libreria dei tipi esportati cambia questi qualsiasi metodo che coincide con un nome di classe per caso Pascal ...

esempio

interface IFoo 
{ 
void randomClass() 
} 

class RandomClass 
{ 
} 

L'IFoo esportato nel tipo lib definisce IFoo-> RandomClass() invece di IFoo-> randomClass()

Qualche idea su cosa causa questo e come fermarlo?

risposta

6

Poiché COM non fa distinzione tra maiuscole e minuscole, sia "RandomClass" che "randomClass" sono lo stesso simbolo nella tabella della libreria di output. (Questo è parte del motivo per cui le linee guida .NET raccomandano PascalCasing per i nomi e i metodi delle classi.)

Quello che viene scelto sarà il primo che emetterà il compilatore, e questo è abbastanza non deterministico dal punto di un programmatore di vista!

È possibile scegliere uno o l'altro, con il parametro di TlbExp /names, ma entrambe le involucri Non si può coesistere nella biblioteca.

da usare file i nomi di TlbExp, è sufficiente creare un file con un elenco di identificatori, uno per riga:

RandomClass 
SomeOtherIdentifier 

Poi si chiamano in questo modo:

tlbexp MyAssembly.dll /names=MyNames.txt 

TlbExp utilizzerà quindi la versione del simbolo definita nel file dei nomi.

+0

Grazie! Non lo sapevo mai. – ljbade

+0

C'è un modo per usare Regasm per usare/nomi quando fa/tlb? – Squirrel

+0

@Squirrel: Non che io sappia. – porges