Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ensambladores

161 views
Skip to first unread message

bogal

unread,
Mar 24, 2008, 8:00:00 AM3/24/08
to
Hola

Estoy empezando a crear ensambladores

Mi función es

Imports Microsoft.SqlServer.Server

Imports System.Data.SqlClient

Imports System.IO

Public Class clr

Inherits System.Web.UI.Page

<SqlFunction()> Public Function texto_descarga(ByVal numero As Byte, ByVal
c0 As Integer, ByVal nversion As Byte) As String

Dim strfichero As String, strruta As String, strfichero_principal As String
= Nothing

strruta = "Aplicaciones/"

strfichero = "aplicacion"

strfichero &= c0 & IIf(nversion > 0, "(" & nversion & ")", "")

strruta = Server.MapPath(strruta)

For Each foundFile As String In My.Computer.FileSystem.GetFiles(strruta,
FileIO.SearchOption.SearchTopLevelOnly, strfichero & ".*")

strfichero_principal = foundFile.Substring(InStrRev(foundFile, "\"))

Exit For

Next

If strfichero_principal Is Nothing Then strfichero_principal = "Falta " &
strfichero

Return strfichero_principal

End Function

End Class

Compilo y obtengo la dll con vbc

Luego me creo el ensamblador así

CREATE ASSEMBLY clr

'FROM 'C:\clr.dll' WITH PERMISSION_SET = safe

Pero me sale un error

Error de ejecución SQL.

Instrucción SQL ejecutada: CREATE ASSEMBLY clr FROM 'C:\clr.dll' WITH
PERMISSION_SET = safe

Origen del error: .Net SqlClient Data Provider

Mensaje de error: Error de CREATE ASSEMBLY para el ensamblado 'clr' debido a
un error de comprobación del ensamblado 'System.Drawing'. Compruebe si los
ensamblados a los que se hace referencia están actualizados y son de
confianza (para external_access o unsafe) para ejecutarse en la base de
datos. Después de este mensaje aparecen los mensajes de error de comprobación
de CLR, si los hay


[ :
System.Drawing.BufferedGraphicsContext::bFillColorTable][mdToken=0x6000243][desplazamiento
0x00000053][se encontró address of Byte] Se esperaba un tipo numérico en la
pila.


[ :
System.Drawing.BufferedGraphicsContext::bFillColorTable][mdToken=0x6000243][desplazamiento
0x00000043][se encontró Native Int][se esperaba address of Byte] Tipo no
esperado en la pila.


[ :
System.Drawing.BufferedGraphicsContext::bFillColorTable][mdToken=0x6000243][desplazamiento
0x00000027][se encontró Native Int][se esperaba address of Byte] Tipo no
esperado en la pila.


[ : System.Drawing.Icon::GetShort][mdToken=0x600045f][desplazamiento
0x00000002] Los punte...


No sé qué puede fallar. ¿Tengo que actualizar las dll a las que llaman los 3
imports? ¿Dónde obtengo las actualizaciones?


Por lo que parece, el system.drawing es llamado por System.Web.UI.Page

Pero si no pongo el inherits, no me reconoce el server.mappath, y ese es mi
problema, el usar el server.mappath. Requiere el System.Web.UI.Page

¿Me podeis guiar, por favor?

Muchas gracias de antemano


Jesús López

unread,
Mar 24, 2008, 12:53:16 PM3/24/08
to
No se llaman ensambladores se llaman ensamblados.

1) Tu clase clr no debe heredar de System.Web.UI.Page. En realidad no debe
heredar de ninguna clase.
2) Las funciones deben ser Shared.
3) Quita la referencia a System.Drawing.dll y a System.Web.dll
4) Busca otra manera de localizar la ruta al archivo que no sea utilizando
Server.MapPath
5) Si tu función va a acceder a recursos externos tienes que crear el
ensamblado con EXTERNAL ACCESS.

Saludos:

Jesús López
www.solidq.com

"bogal" <bo...@discussions.microsoft.com> escribió en el mensaje
news:42F495D3-BF1E-4545...@microsoft.com...

martin

unread,
Mar 27, 2008, 5:20:00 AM3/27/08
to
Hola de nuevo

Gracias, Jesús

Lo hago como dices

Ahora, al crear el ensamblado así:

CREATE ASSEMBLY clr
FROM 'C:\clr.dll' WITH permission_SET = external_access

Error de ejecución SQL.

Instrucción SQL ejecutada: CREATE ASSEMBLY clr FROM 'C:\Documents and
Settings\Martin\Mis documentos\Mis proyectos\Cresolia\bin\clr.dll' WITH
PERMISSION_SET = external_access


Origen del error: .Net SqlClient Data Provider

Mensaje de error: Error de CREATE ASSEMBLY para el ensamblado 'clr' porque
el ensamblado 'clr' no tiene autorización para PERMISSION_SET =
EXTERNAL_ACCESS. El ensamblado está autorizado cuando se produce una de las
siguientes situaciónes: el propietario de la base de datos tiene permiso de
EXTERNAL ACCESS ASSEMBLY y la base de datos tiene definida la propiedad de
base de datos TRUSTWORTHY, o el ensamblado está firmado con un certificado o
una clave asimétrica que tiene un inicio de sesión correspondiente con
permiso de EXTERNAL ACCESS ASSEMBLY.


Estoy intentando ver dónde he de darle el permiso oportuno.

Te agradecería mucho tu ayuda. Saludos.

me da este error:


martin

unread,
Mar 27, 2008, 5:37:00 AM3/27/08
to
Hola

He de decir que martin=bogal. Es mi otra cuenta de correo

Ya he visto cómo conceder el permiso

USE master
GRANT EXTERNAL access assembly TO <inicio sesion>

El tema es que accedo al sql server con autenticación de windows, y no sé
cómo poner la instrucción gran

Muchas gracias de nuevo

Jesús López

unread,
Mar 27, 2008, 5:55:17 AM3/27/08
to
Antes de crear el ensamblado ejecuta esto en el Management Studio:

ALTER DATABASE <base de datos> SET TRUSTWORTHY ON


Saludos:


Jesús López
www.solidq.com

"martin" <mar...@discussions.microsoft.com> escribió en el mensaje
news:17F98F54-89BA-4303...@microsoft.com...

martin

unread,
Mar 27, 2008, 6:21:00 AM3/27/08
to
Hola

Muchísimas gracias, Jesús.

La verdad es que me tenía totalmente loco. Ya puedo cantar y todo :=)

Saludos

martin

unread,
Mar 27, 2008, 8:01:01 AM3/27/08
to
Hola de nuevo

He intentado probar la función clr del ensamblado

Me da un error

Error de .NET Framework durante la ejecución de la rutina o agregado
definido por el usuario 'texto_descarga':
System.Security.HostProtectionException: Attempted to perform an operation
that was forbidden by the CLR host.

The protected resources (only available with full trust) were: All
The demanded resources were: ExternalProcessMgmt

System.Security.HostProtectionException:
at
System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Assembly asm,
PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh,
SecurityAction action, Object demand, IPermission permThatFailed)
at System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Object
assemblyOrString, PermissionSet granted, PermissionSet refused,
RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission
permThatFailed)
at System.Security.CodeAccessSecurityEngine.CheckSetHelper(PermissionSet
grants, PermissionSet refused, PermissionSet demands, RuntimeMethodHandle
rmh, Object assemblyOrString, SecurityAction action, Boolean throwException)
at System.Security.CodeAccessSecurityEngine.CheckSetHelper(CompressedStack
cs, PermissionSet grants, PermissionSet refused, PermissionSet demands,
RuntimeMethodHandle rmh, Assembly asm, SecurityAction action)
at seguimientos.texto_descarga(SqlByte numero, SqlInt32 c0, SqlByte
nversion)


Tal vez tenga que ver con la cadena de conexión. La tengo así


<add name="conexion"
connectionString="SERVER=(local);trusted_connection=true;UID=;DataBase=nuevo;PWD="/>

Gracias por la ayuda. Busco en google, pero me es urgente y algo complicado
de entender

Muchas gracias por la paciencia y ayuda

martin

unread,
Mar 27, 2008, 9:30:02 AM3/27/08
to
Hola a todos

Todo solucionado.

Por si puede resultar útil. Hay métodos y tipos que no están permitidos en
los sqlclr, udfclr...

En mi caso, al usar recursos externos, no está permitido el uso de
filesystem y sí el uso de file (system.io)

Es lo que se llama el CAS

Gracias, y un saludo

Jesús López

unread,
Mar 27, 2008, 9:33:08 AM3/27/08
to
Eso no tiene que ver con la cadena de conexión. Cuando un ensamblado tiene
permiso de EXTERNAL ACCESS no significa que lo pueda hacer todo. SQL Server
impone una serie de restriccíones a las cosas que se pueden hacer para
protegerse de malas prácticas de programación y poder asegurar la
estabilidad del sistema. Cuando SQL Server detecta que el ensamblado quiere
hacer ciertas cosas prohibidas para permiso EXTERNAL ACCESS, lanza la
exceptión HostProtectionException.

Necesito ver el código de la función para ver lo que hace y que a SQL Server
no le gusta.


¿Seguro que creaste el ensamblado con EXTERNAL ACCESS?

Saludos:

Jesús López
www.soldiq.com


"martin" <mar...@discussions.microsoft.com> escribió en el mensaje

news:978039FB-AAEB-474E...@microsoft.com...

0 new messages