Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema de y con Clases!

Estas en el tema de Problema de y con Clases! en el foro de .NET en Foros del Web. Hola, espero que alguien me pueda dar una mano en esto, ya que estoy migrando de ASP a .NET y me resulta imprescindible para poder ...
  #1 (permalink)  
Antiguo 03/06/2005, 13:08
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 10 meses
Puntos: 9
Problema de y con Clases!

Hola, espero que alguien me pueda dar una mano en esto, ya que estoy migrando de ASP a .NET y me resulta imprescindible para poder seguir continuando con mi trabajo. Tengo esta clase de un carro de compras muy simple a la cual despues le tengo que ir agregando todas las funcionalidades que tenía para ASP. Mi pregunta es la siguiente: cuando trato de ejecutar en una pagina ASPX esta clase, me dice que el objeto no está definido. Como hago esto es así:


Sub Page_Load(Sender As object, E As EventArgs)

Dim MyCart As New ShopCart

MyCart.AddToCart(15,8)


End Sub

Por que me dice que no está definido?, tengo el archivo de la clase en el mismo directorio que la pagina ASPX, pero no puedo hacer que me funcione. Hay que hacer algo más que eso?

Les dejo el código de la clase, por ahí el problema está en la formulacion de la misma.

Imports System.Collections

Namespace System.Collections

Public Class ShopCart

Dim CartItems As New Hashtable

Public Sub addToCart(Id, Quantity)


if CartItems.Contains(Id) then
CartItems.Add(Id, Quantity)
else
CartItems.Add(Id, 1)
End If


End Sub


Public Sub DeleteProduct(Id)

CartItems.Remove(Id)

End Sub



End Class

End Namespace

Saludos y gracias de antemano!.
  #2 (permalink)  
Antiguo 03/06/2005, 15:15
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 20 años, 1 mes
Puntos: 7
Código:
Imports System.Collections
 
Namespace System.Collections
  Public Class ShopCart
   Dim CartItems As New Hashtable
   Public Sub addToCart(Id, Quantity)
	 if CartItems.Contains(Id) then
	  CartItems.Add(Id, Quantity)
	 else
	  CartItems.Add(Id, 1)
	 End If
    End Sub
   Public Sub DeleteProduct(Id)
    CartItems.Remove(Id)
   End Sub
  End Class
End Namespace
Según el código que muestras, estás ubicando tu clase dentro del espacio de nombres System.Collections, consecuentemente deberías crear tu clase de la siguiente forma:
Código:
Sub Page_Load(Sender As object, E As EventArgs)
        Dim MyCart As New System.Collections.ShopCart 
        MyCart.AddToCart(15,8)
    End Sub
Lo mejor sería que utilizes un espacio de nombres relacionado a lo que estás haciendo, por ejm:
Namespace TuEmpresa.TuArea.TuClase

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 03/06/2005, 16:07
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 10 meses
Puntos: 9
Hola XKnown, antes que nada gracias por responder. Te quería comentar que no puse System.Collections debido a que lo importo, cometí el error de no mostrar todo el código, disculpa. A pesar de eso, me da el error que comenté al principio de este post.
Le ves algún error a la clase? hay que registrarla en algún lado para que este disponible?. Bueno, saludos xknown, suerte!.
  #4 (permalink)  
Antiguo 03/06/2005, 16:55
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 20 años, 1 mes
Puntos: 7
Pues como te dije en el mensaje anterior, dentro del código que mandaste estás colocando "Namespace System.Collections", esto sirve para evitar colisiones en los nombres, no confundas esto con "Imports System.Collections". En todo caso para aclarar mejor las cosas envía el código en la que defines la clase...

Saludos
PD. Probaste creando tu clase con "Dim MyCart As New System.Collections.ShopCart"?
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 03/06/2005, 17:54
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 10 meses
Puntos: 9
Acá están los códigos completos, yo no me refería a Imports, sino a Import Namespace="System.Collections", que lo pongo en la pagina ASPX. Te dejo el código, espero que puedas ayudarme con esto porque sinceramente yo no le veo el error.
Saludos xKnown y muchas gracias nuevamente por seguir con este tema. Te lo agradezco sinceramente.

CartClasses.Vb

Imports System.Collections

Namespace System.Collections

Public Class ShopCart

Dim CartItems As New Hashtable

Public Sub addToCart(Id, Quantity)


if CartItems.Contains(Id) then
CartItems.Add(Id, Quantity)
else
CartItems.Add(Id, 1)
End If


End Sub


Public Sub DeleteProduct(Id)

CartItems.Remove(Id)

End Sub



End Class

End Namespace


Cart.aspx

<%@ Page Language="VB" %>
<%@ Import Namespace="System.Collections"%>
<script runat="server">

Sub Page_Load(Sender As object, E As EventArgs)

Dim MyCart As New ShopCart
MyCart.AddToCart(15,8)

End Sub

</script>

PD. Son los códigos completos de las dos páginas, la primera es donde creo la clase y en la segunda lógicamente la instancio. Gracias xKnown.!
  #6 (permalink)  
Antiguo 03/06/2005, 18:15
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 20 años, 1 mes
Puntos: 7
Ahora veo el problema..., seguramente estás usando WebMatrix no?

Bueno, el detalle es que para utilizar la clase que definiste (perdona la insistencia pero está de más lo siguiente "Namespace System.Collections"), tienes que compilarla en un ensamblado, sino no podrás utilizarla... (esto cambia en asp.net 2.0)

vbc /t:library /out:CartClasses.dll CartClasses.Vb

El compilador de Visual Basic en mi caso se encuentra en:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215 (.Net 2.0 beta2)
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 (.Net 1.41)

Ahora copias el ensamblado generado "CartClasses.dll" a la carpeta "bin" de tu aplicación (si no existe, lo creas...)

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #7 (permalink)  
Antiguo 03/06/2005, 19:42
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 10 meses
Puntos: 9
No voy a dejar de agradecerte xknown por lo que me estás ayudando. Ahora (disculpa por ser tan insistente con un mismo tema) intenté ejecutar el vbc y me abre una ventana que se me cierra automaticamente sin dejarme ejecutar nada. En donde tendría uqe poner esta linea " vbc /t:library /out:CartClasses.dll CartClasses.Vb " ?
Muchas gracias, un saludazo!.
  #8 (permalink)  
Antiguo 04/06/2005, 09:51
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 10 meses
Puntos: 9
Bueno, genere la DLL, la copie a una carpeta llamada aplicaciones uqe contiene todos los archivos importantes, como machine.config, web.config, etc además en esa carpeta estaba la carpeta bin y ahi copie la DLL, pero sigue sin funcionarme. Borre la linea que me habias dicho xknown (namespace System.Collections), como se a que namespace pertenece mi clase?, bueno espero que me puedas dar una ultima mano en esto, ya que sin vos no podria haber hecho nada de esto.
Saludos!.
  #9 (permalink)  
Antiguo 04/06/2005, 11:11
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 20 años, 1 mes
Puntos: 7
Si tu clase no está dentro de un espacio de nombres no es necesario hacer nada, ya que por defecto busca el ensamblado (dll) en la carpeta bin.

Ahora si quieres hacer referencia a tu clase sin necesidad de compilar puedes usar la directiva Assembly, te pongo el siguiente ejemplo:
Código:
<%@ Page Language="VB" %>
<!--
Hacer que asp.net compile dinámicamente el ensamblado
<%@ Assembly Src="CartClases.vb" %>

Importa el nombre de espacio si es que lo hubiera, en este caso la clase deberia estar dentro de "Namespace Demo.Web ... End Namespace"
<%@ import Namespace="Demo.Web" %>
-->

<script runat="server">
    Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim MyCart As New ShopCart
    MyCart.AddToCart(15,8)
    Response.Write(DateTime.Now.ToLongTimeString())
    End Sub
</script>
<html>
<head>
</head>
<body>
</body>
</html>
Si tu ensamblado ya está dentro de la carpeta bin, no es necesario poner todo lo que está entre <!-- -->, a excepción de "import ...".

Si no funciona, puedes ver un ejemplo que subí en http://test.buayacorp.demo.zip

Para lo de las directivas de página te sugiero que leas lo siguiente:
http://msdn.microsoft.com/library/sp...freference.asp

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #10 (permalink)  
Antiguo 04/06/2005, 11:35
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 10 meses
Puntos: 9
E-x-c-e-l-e-n-t-e!

Muchas gracias xknown funciona ahora. Un par de dudas que me quedan. Supongamos que yo no lo quiero hacer que me genere la DLL dinamicamente (que es como me funciona ahora), de la otra forma, es decir, compilando yo, me da error. Por que sera?. Te comento bien cuales fueron los pasos que segui para ver en donde cometi el error. Genero la DLL, a través de Inicio/Ejecutar. Ahí pongo la ruta del compilador, más la linea que me habias puesto vos en un post anterior, agregando la ruta del archivo VB. Eso me genera la DLL que me queda en la carpeta del FrameWork. Luego, lo que hice fue copiarla y pegarla en la carpeta BIN, que está dentro de una carpeta llamada Aplicaciones que contiene todos los archivos importantes, como el global.asax, el machine.config, etc. Ahora bien, la ruta de esta carpeta es C:\Inetpub\wwwroot\Aplicaciones, pero las paginas aspx las tengo en una carpeta distinta, C:\Inetpub\wwwroot\ASPXFiles. Deberían estar en la misma carpeta? o ese no es el problema?. Otra cosa, no se si me estará generando bien la DLL, porque cuando voy a ver la versión del arhivo, esta es 0.0.0, eso es correcto?.
Y una ultima consulta mas xknown y prometo no molestarte mas!, es optimo hacer que me genere dinamicamente la DLL?.
No sabes cuanto te agradezco xknown, ahora puedo seguir con mi trabajo gracias a vos, un millón de gracias por todo!.
Suerte!.
  #11 (permalink)  
Antiguo 04/06/2005, 12:13
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 20 años, 1 mes
Puntos: 7
Hola,

Ya veo porque no te funciona..., te explicaré de manera general:

Asumiendo que existe una carpeta marcada como Directorio Virtual en IIS:
C:\Inetpub\wwwroot\ShoppingCart

Ahora, TODOS los ensamblados que uses en tu aplicación deberían ir en:
C:\Inetpub\wwwroot\ShoppingCart\bin

Si quieres poner tus archivos aspx en una carpeta diferente, puedes hacerlo sin ningún problema, no importa el nivel de profundidad de los archivos que necesiten alguno de tus ensamblados, siempre se buscará en la carpeta bin de tu Aplicación (C:\Inetpub\wwwroot\ShoppingCart\bin):
C:\Inetpub\wwwroot\ShoppingCart\Foo\Bar\ASPXFiles

Ahora viendo la estructura de directorio que tienes, si ASPXFiles o Aplicaciones no están marcados como directorios virtuales, entonces deberías poner tu ensamblado en C:\Inetpub\wwwroot\bin, por otro lado el Web.Config debe estar en el directorio raiz (hay la posibilidad de que también estén presentes en otros subdirectorios), NO es necesario tener el machine.config en ese directorio, el web.config basta y sobra para configurar ciertos detalles de tu aplicación.

Ahora, hasta donde sé, no hay casi diferencia entre una u otra forma de trabajar, la compilación del archivo sólo se realiza la primera vez que carga la página, si usas un ensamblado ya generado (dll), también necesita que éste se cargue en el cache de ensamblados, todo eso sucede sólo la primera vez que carga la página, puedes bajar una animación de cómo es este proceso: http://test.buayacorp.com/dia-10.zip

Saludos

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #12 (permalink)  
Antiguo 04/06/2005, 13:00
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 10 meses
Puntos: 9
Muchas gracias por todo xknown. Entonces voy a dejarlo como me pasaste vos el código para el proceso de prueba, y una vez que termine con todas las pruebas y compruebe el correcto funcionamiento de la clase, ahi si voy a generar la DLL y voy a seguir los pasos que me acabas de decir. Te agradezco xknow, saludos!.

PD. muy bueno los links que me pasaste, gracias por eso también.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:39.