Foros del Web » Programando para Internet » ASPX (.net) »

Probemas con Dll de .Net en COM+

Estas en el tema de Probemas con Dll de .Net en COM+ en el foro de ASPX (.net) en Foros del Web. Hola a Todos: Escribo este topico para ver si alguien alguna vez renego con esto y me pueda dar una mano, en su momento fue ...
  #1 (permalink)  
Antiguo 26/10/2005, 13:32
Avatar de julioszabo  
Fecha de Ingreso: octubre-2004
Mensajes: 47
Antigüedad: 19 años, 6 meses
Puntos: 0
Probemas con Dll de .Net en COM+

Hola a Todos:
Escribo este topico para ver si alguien alguna vez renego con esto y me pueda dar una mano, en su momento fue la solucion a unos de los problemas que plantie en este foro, pero cuando lo lleve a la practica no funciono.
La situacion:
Tengo un componente creado en .Net, es un proyecto de Clase con 2 metodos publicos que los utilizo para subir y bajar archivos. El tema es que la carpeta donde se encuantran estos archivos, esta protegida con contraseña. Para solucionar esto, firme el AssemblyInfo y puse un par de referencias para poder publicar la dll que genera en COM+, bajo el usuario que tiene los permisos de la carpeta donde se encuantra el Archivo.
Lo ocurrido:
Genere y publique la dll del proyecto en COM+, despues de renegar un poco e investigar como se hacia, lo logre. Probe subir y bajar archivos desde la Carpeta en cuestion, sin permisos y andubo lo mas bien.
El Problema:
Para hacer el DownLoad, me baje un codigo de la Web, que hasta este momento funcionaba de lo mas bien, pero cuando le puse la contraseña a la carpeta y la misma la setie en COM+, me largaba un error en uno de los objetos. Este es el codigo del Metodo de una de las clases de mi proyecto que llama al Metodo de la Dll:

public Sub BajarArchivo(ByRef pFormWeb as Object, ByVal pPathToDownload as String, ByVal pNameToFileDestination as String)

'- pForm es el Objeto Response pasado como Referencia
'- objetos
Dim objStream As Stream
Dim objFileManager As FileManager 'Clase de la dll en COM+
'- Genero un Contenedor de Lectura de 10K bytes
Dim Buffer(10000) As Byte
Dim Length As Integer
Try
'- obtengo el binario
objFileManager = New FileManager
objStream = objFileManager.DownloadFile(pPathToDownload)

'- Total de bytes a leer
Dim DataToRead As Long = objStream.Length
'- Seteo el HTTP
pFormWeb.ContentType = "Application/Octet-Stream"
'- Inicializo e indico el nombre del Archivo por Defecto
Call pFormWeb.AppendHeader("Content-Disposition", "Attachment; Filename=""" & pNameToFileDestination & """")
'- Leo los bytes
While DataToRead > 0
'- Verifico que el cliente este conectado
If pFormWeb.IsClientConnected Then
'- Leo los datos del Contenedor de Lectura
'- y almaceno el Tamaño de la lectura
Length = objStream.Read(Buffer, 0, 10000)
'- Escribo los datos en el Disco del Cliente
Call pFormWeb.OutputStream.Write(Buffer, 0, Length)
'- Limpio los datos del HTML
Call pFormWeb.Flush()
'- Limpio el Contenedor de Lectura
ReDim Buffer(10000)
'- Calculo la cantidad de bytes restantes a leer
DataToRead = DataToRead - Length
Else
'- Finalizo la lectura si el cliente se desconecta
DataToRead = -1
End If
End While
Catch ex As Exception
'- Mensaje de cualquier Error
Call pFormWeb.Write("<script> window.alert ('" & ex.Message & "'); </script>")
Finally
If IsNothing(objStream) = False Then
'- Cierro el Archivo
objStream.Close()
pFormWeb.end()
End If
End Try
End Sub

Metodo "DownloadFile" de la Dll:

Public Function DownloadFile() as Object
'- Abro el archivo
objStream = New System.IO.FileStream(pPathToDownload, _
System.IO.FileMode.Open, _
IO.FileAccess.Read, _
IO.FileShare.Read)
'- retorno
Return objStream
End Function

Bueno, como ya dije, esto funciona, sin permisos sobre COM+ y sobre la Carpeta donde estan los Archivos. El error me lo da en la Linea que esta en Rojo, y me dice que no se puede cerrar el Archivo, he probado de mil formas, y no lo he podido hacer andar. Por ahi el problema es que paso el objeto Stream y este tenga algun vinculo con el que abrio la Dll que tiene los permisos, pero no se como solucionarlo.

Si alguien renego con esto alguna vez o se le ocurre alguna otra forma de solucionarlo, por favor, me avise.

Desde ya muchas gracias.

Julio.
  #2 (permalink)  
Antiguo 26/10/2005, 21:32
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Creo que en lugar de que retornes un Stream (no le veo mucho sentido a eso...), deberías retornar un array de bytes (http://www.yoda.arachsys.com/csharp/readbinary.html)

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 28/10/2005, 11:34
Avatar de julioszabo  
Fecha de Ingreso: octubre-2004
Mensajes: 47
Antigüedad: 19 años, 6 meses
Puntos: 0
Hola Alex, disculpame que te joda, pero no he laburado mucho con esto y me esta costando bastante. Vi la pagina que me recomendaste y esta muy buena, lo implemente y la funcion me retorna el Array de Bytes, el tema es que no se como tratarlo cuando lo recibo, ya que yo necesito ir recorriendo el Stream para ir escribiendo en el objeto Response, que recibo como referencia, para poder hacer el Download. No se si se entiende, pero el codigo que publique esta bien comentado y con esto se puede ver bien lo que necesito.

Bueno, desde ya un millon de gracias.

Julio.
  #4 (permalink)  
Antiguo 28/10/2005, 11:48
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
El objeto Response tiene un método BinaryWrite que acepta un array de bytes como parámetro.

Saludos
PS. Siempre intenta buscar en la documentación...
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 31/10/2005, 10:38
Avatar de julioszabo  
Fecha de Ingreso: octubre-2004
Mensajes: 47
Antigüedad: 19 años, 6 meses
Puntos: 0
De acuerdo

Bueno, les cuento que gracias a la ayuda que me dio Alex, pude solucionar el problema que tenia de comunicacion de objetos entre VB6 y .Net, asi que aprovecho para darle las gracias a todos los que se interesaron.

Saludos, Julio.
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 13:50.