Recientemente tuve un error que solo se manifestó cuando la biblioteca se creó como una versión de lanzamiento en lugar de una versión de depuración. La biblioteca es .NET dll con un contenedor COM y estoy usando CoCreateInstance para crear una clase desde el dll en una aplicación C++ no administrada. Cuando finalmente rastreé el error fue causado por el acceso a un objeto singleton. Tenía la instancia singleton declarada como tal:¿Cuál es la diferencia en estas formas de crear la instancia estática para un singleton?
private static readonly MyObjectType s_instance = new MyObjectType;
luego se puede acceder con:
public static MyObjectType Instance
{
get
{
return s_instance;
}
}
este estaba fallando. Cambiándolo a:
private static MyObjectType s_instance;
public static MyObjectType Instance
{
get
{
if (s_instance==null)
{
s_instance = new MyObjectType();
}
return s_instance;
}
}
solucionó el problema. ¿Alguna idea de por qué el uso inicial no funcionó y si hay inconvenientes para hacerlo de cualquier manera?
El dll de lanzamiento parecía ser perfectamente utilizable desde otra aplicación administrada.
¿Cómo se manifestó este error? ¿Se bloqueó? ¿Hubo un mensaje de error? –
La llamada a CoCreateInstance acaba de devolver 'ClassNotRegistered' cada vez. Pero solo en una construcción relaese. en una versión de depuración todo funcionó bien. –
Su solución no es segura para subprocesos. – Joe