2009-07-31 12 views
6

Tengo un componente COM de VC++ con una biblioteca de tipos. La biblioteca de tipo de este componente declara una interfaz y una clase co:Los nombres en el conjunto de interoperabilidad tienen mayúsculas incorrectas

[ 
    object, 
    uuid(ActualUuidHere), 
    dual, 
    nonextensible, 
    oleautomation, 
    hidden, 
    helpstring(ActualHelpStringHere) 
] 
interface IWorkflow : IDispatch 
{ 
    //irrelevant properties here  
} 

[ 
    uuid(ActualClassIdHere), 
    noncreatable 
] 
coclass Workflow { 
    [default] interface IWorkflow; 
}; 

el fin de consumir el componente desde una aplicación C# agrego una referencia al proyecto C# y un ensamblado de interoperabilidad se genera.

En el Examinador de objetos de Visual Studio 2003 veo que la interoperabilidad contiene:

public abstract interface IWorkflow; 
public abstract interface workflow : IWorkflow; 
public class workflowClass : System.Object; 

Está claro que que por alguna razón el nombre de la clase y la interfaz se diferencian en las mayúsculas. Esto no sucede con otras 20 interfaces declaradas en la misma biblioteca de tipos, para ellas ISomething corresponde a Something y SomethingClass.

He revisado los archivos .idl del proyecto; el identificador Workflow no se usa en ningún otro lado.

¿Cuál es el motivo de este comportamiento extraño y cómo se puede solucionar?

Respuesta

6

Mire a través de su código y ver si hay algún parámetro, la propiedad o el nombre del método que tiene la ortografía exacta y capitalización de "flujo de trabajo". Seguramente será un parámetro para una función de interfaz COM. Cambie el nombre para que sea paramWorkflow y su problema desaparecerá.

¿Por qué sucede esto? Existe un error en las herramientas de la biblioteca de tipos donde almacenan identificadores internamente de manera no sensible a mayúsculas y minúsculas. Entonces, si tiene dos nombres con diferente capatilización, se almacenarán en la misma ranura. Estos nombres se usan directamente en el momento de la generación, por lo que se emitirá la diferente carcasa.

La forma de evitar esto es evitar el conflicto creando diferentes nombres.

+0

Revisé todos los archivos IDL del proyecto; el nombre no se usa en ningún otro lado. – sharptooth

+0

Gracias. Estaba teniendo este problema, y ​​tu solución lo solucionó. – Grokys

2

Sí, esto realmente sucede. Teníamos una propiedad con un nombre de pila y un parámetro para otro método que se cambió y luego colisionó. Mismo nombre, diferente carcasa ... wham. Para hacer las cosas aún más interesantes, tenemos dos objetivos de compilación, y algo fue lo suficientemente diferente sobre el orden de compilación que obtuvimos una capitalización en uno-- que funcionó-- y la otra en el otro-- que falló. Es una verdadera diversión cuando ambos proyectos comprueban la misma fuente y los mismos archivos .sln, etc. Qué maravilla rastrea uno.

Cuestiones relacionadas