Este realmente me tiene perplejo. Estoy trabajando con otro desarrollador que me llamó porque no podía creer lo que estaba viendo. Pasamos juntos con el depurador y lo vi también y no tuve ninguna explicación. Aquí está el escenario. Él está escribiendo un método que interactúa con una tercera objeto COM partido a través de un contenedor COM generada automáticamente (generada simplemente añadiendo el componente COM como una referencia Aquí está la parte superior de su método:.¿Cómo puede afectar la configuración de una variable cuyo ámbito de método C# afecta a otra?
public bool RefolderDocument(ref IManDocument oDoc)
{
string strCustom1 = (string) oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom1);
string strCustom2 = (string) oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom2);
El propósito de la el código es obtener un número de proyecto y un número de subproyecto de un objeto "documento" (oDoc).
Esto es lo que sucede a medida que avanza. Después de la primera asignación strCustom1 tiene el valor esperado "32344" (un número de proyecto) y strCustom2 está vacío como se esperaba. Después de la segunda asignación, strCustom2 obtiene el número de subproyecto "0002" - , pero strCustom1 se ha cambiado a 32334 - un carácter ha sido cambiado?
Me pareció algo así como un exceso de sobremuestreo de lenguaje c de la vieja escuela (que no esperaría en una aplicación administrada incluso si estaba interoperando con un componente COM). Todos estábamos desconcertados. En un intento de cortar alrededor de esta rareza, he tratado de copiar el contenido de la primera cadena a otra ubicación de este modo:
public bool RefolderDocument(ref IManDocument oDoc)
{
string strCustom1 = string.Copy((string)oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom1));
string strCustom2 = string.Copy((string)oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom2));
mismos resultados! A estas alturas, nos aferrábamos a las pajas y dejamos caer el código de .NET 4 a .NET 3.5 (CLR 2) pero sin cambios. Un punto quizás relevante es que este es un servicio y nos estamos uniendo al proceso de servicio. La compilación apunta a x86 y la ubicación del servicio definitivamente está en la carpeta de generación de salida de depuración.
¿Hay alguna explicación lógica para esto? Estoy perplejo en cuanto a cómo proceder.
'string.Copy' fue su intento de solucionar este extraño problema ... –
Sí. String.Copy fue un intento de mover la ubicación de lo que strCustom1 apuntaba antes de que se sobrescribiera la ubicación de origen. Esperaba que esto funcionara. No fue así. –