Se produjo un problema interesante que me preguntaba si alguien puede ayudarme a explicarlo. Intenté buscar en Internet y parece que no puedo encontrar una respuesta a este problema. Si bien tenemos una solución, otros pueden encontrarse con el mismo problema, y dado que fue aleatorio, es muy difícil localizarlo.Alinear el parámetro "como cadena" de C#
Tenemos una aplicación que falla al azar cuando la computadora está conectada a la red corporativa del cliente (no tiene mucha información en la red). Cuando llevamos la computadora a nuestro entorno funcionó bien. La falla es bastante aleatoria, pero lo mejor que pude averiguar ocurrió durante las llamadas de C# a una DLL de proveedores externos no administrados. Uno de los rastreos que tengo (solo un par de fallas proporcionaron trazas en el registro de eventos del sistema) apunta a un error en ntdll.dll en la función RtlMoveMemory durante la clasificación de los parámetros en las llamadas a la DLL no administrada.
La llamada a la función no administrada fue:
ThirdParty.CxxxAutomationWrapper clientDLL = new ThirdParty.CxxxAutomationWrapper() ;
object Parameter1 ;
:
string theValue = "abcde" ;
Parameter1 = theValue ;
:
if (Parameter1 is string)
{
int returnCode = clientDLL.function (Parameter1 as string) ;
}
la llamada falla periódicamente en el equipo de los clientes, pero siempre funciona cuando se ejecuta dentro de Visual Studio (2010). El valor de Parameter1 está configurado correctamente (nunca nulo).
Desde que cambié la llamada a:
String parameter1String = Parameter1.ToString() ;
int returnCode = clientDLL.function (parameter1String) ;
todo ha funcionado bien. El valor de Parameter1 está muy controlado y no es nulo antes de que se ejecute este código.
La interfaz se llama (clientDLL.function) se define como: [? Limitado]
HRESULT function ([in] BSTR parameter,
[out, retval] long *ret);
Con mi comprensión del 'como' declaración en C#, no entiendo por qué la primera versión de esto falló ¿Alguien puede ayudar a explicar por qué falla cuando se llama con el parámetro especificado como "como cadena"?
Actualicé la publicación original en respuesta a las respuestas que recibí para ayudar a aclarar el problema. Las actualizaciones incluyen mostrar cómo se declara y se asigna el parámetro1, y poner un if (el parámetro 1 es una cadena) alrededor de la llamada como lo sugiere Tudor. –
¿Puede intentar registrar para qué valores de 'Parameter1' se produce el bloqueo? ¿Puedes ver algún patrón? – Tudor
He codificado el código exacto que se muestra arriba, codificando la asignación a una variable de cadena inicializándola con "abcde" y asignando esa variable a Parameter1 probándola a través de if (Parámetro1 es una cadena) y todavía funciona bien en Visual Studio pero falla afuera de VS (a veces). –