none
Problema al usar DLL RRS feed

  • Pregunta

  • Hola ...

    Desarrolle una DLL que utilizo tanto en proyectos de escritorios como proyectos web , cuanto intento usar la dll en el proyecto de escritorio debo comentar algunos atributos o propiedades que uso para los metodos Web ... por q de lo contrario me devuelve error.

    por ejemplo  en esta linea  me devuelve  (System.NullReferenceException) referencia a objeto no establecida como instancia de un objeto:

    private string pathCertificadoWebEmisor =

    System.Web.HttpContext.Current.Server.MapPath("~/ServerFile/310140886114.p12");

      Existe alguna manera de solucionar esto ??


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    sábado, 31 de marzo de 2018 9:41

Respuestas

  • Existe alguna manera de solucionar esto ??

    Sí, existe una manera muy sencilla de solucionarlo: poner un "if".

    Simplemente examina el HttpContext.Current, y si es null quiere decir que se trata de una aplicación de escritorio (y por lo tato no tiene sentido ejecutar el Server.MapPath), de lo contrario sigues adelante y tomas el .Server.MapPath.

    private string pathCertificadoWebEmisor;
    if (System.Web.HttpContext.Current != null)
        pathCertificadoWebEmisor = System.Web.HttpContext.Current.Server.MapPath("~/ServerFile/310140886114.p12");
    else
        'Sacar el certificado de otro sitio porque el Server.MapPath no existe
    
    

    sábado, 31 de marzo de 2018 10:46
    Moderador

Todas las respuestas

  • Tal vez fue a usted, o fue a alguien más que le dije, pero lo dije a alguien:  Que lo que le recomendó el señor Tutini de referenciar System.Web en la DLL era un mal camino.  He aquí la consecuencia.

    Si no fue a usted, le repito el consejo que di a esa persona en ese momento:  En vez de que la DLL trate de obtener rutas relativas por sí misma, lo que debe hacer es solicitar rutas absolutas y punto.

    Lo que veo en el código que usted muestra es algo parecido a una constante.  La ruta a lo que creo es un archivo de certificado.  Si hay una clase en su DLL que necesita la ruta al certificado, lo que debe hacer es pasar la ruta absoluta al objeto, tal vez como un argumento del constructor.

    Imaginando que es una clase llamada LaClase, yo tendría algo como:

    public class LaClase
    {
        private string _pathCertificado;
    
        public LaClase(string pathCert)
        {
            _pathCertificado = pathCert;
        }
        ...
    }

    Entonces, desde un proyecto web construiría la clase así:

    LaClase c = new LaClase(Server.MapPath("~/ServerFile/xxx.p12");

    Y desde un proyecto, por ejemplo de consola:

    LaClase c = new LaClase(Path.Combine(Environment.CurrentDirectory, @"ServerFile\xxx.p12"));


    Jose R. MCP
    Code Samples

    sábado, 31 de marzo de 2018 10:43
    Moderador
  • Existe alguna manera de solucionar esto ??

    Sí, existe una manera muy sencilla de solucionarlo: poner un "if".

    Simplemente examina el HttpContext.Current, y si es null quiere decir que se trata de una aplicación de escritorio (y por lo tato no tiene sentido ejecutar el Server.MapPath), de lo contrario sigues adelante y tomas el .Server.MapPath.

    private string pathCertificadoWebEmisor;
    if (System.Web.HttpContext.Current != null)
        pathCertificadoWebEmisor = System.Web.HttpContext.Current.Server.MapPath("~/ServerFile/310140886114.p12");
    else
        'Sacar el certificado de otro sitio porque el Server.MapPath no existe
    
    

    sábado, 31 de marzo de 2018 10:46
    Moderador
  • hola

    >>Desarrolle una DLL que utilizo tanto en proyectos de escritorios como proyectos web , cuanto intento usar la dll en el proyecto de escritorio

    como una libreria que fue pensada para un desarrollo web vas a usarla en un desarrollo desktop, eso es pesimo

    para que crees que se inventaron las interfaces, la herencia, polimorforsmo, etc

    se supone que debes hacer una funcionalidad base, y despues la forma en como resolver segun el entorno puedas variarlo segun el caso

    no se define nunca ese dato en una variable directamente

    public interface IClassXX{

    string pathCertificadoWebEmisor {get;set;}

    void GetPath();

    }

    public class ClassWeb : IClassXX { public string pathCertificadoWebEmisor {get;set;} public void GetPath() { pathCertificadoWebEmisor = System.Web.HttpContext.Current.Server.MapPath("~/ServerFile/310140886114.p12"); } } public class ClassDesktop : IClassXX { public string pathCertificadoWebEmisor {get;set;} public void GetPath() { pathCertificadoWebEmisor = ....; // aqui la implementacion desktop } }

    la idea es que uses en un caso u otro la clase que corresponde, lo correcto seria que ademas exista una interfaz que puedas inyectar usando algun libreria de IoC

    asi deberias desarrollar cuando cambia el ambiente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 3 de abril de 2018 5:27