2009-07-30 21 views
9

Tengo un servicio Web XML en funcionamiento escrito en ASP.Net. Ahora necesito hacer referencia a ciertos conjuntos que se encuentran en una carpeta específica, p. c:\NotMyCode
I no quiero copiar/duplicar tropecientos de dlls en esa carpeta en mi carpeta bin.¿Cómo hago referencia a los ensamblajes fuera de la carpeta bin en una aplicación ASP.net?

Intenté mantener el CopyLocal=false para los ensamblados mencionados en el servicio web. Eso terminó en una excepción FileNotFound para el ensamblado. Cuando cambio a CopyLocal=true, los archivos DLL a los que se hace referencia se copian a la carpeta bin ... y funciona.

Así que mi pregunta aquí es: ¿Cómo hago referencia a los ensamblajes que no se encuentran en mi carpeta bin o debajo de una subcarpeta? ¿Debo cambiar algunos archivos de políticas de seguridad en algún lugar? Creo que no soy la primera persona que desea hacer algo como esto ... así que supongo que alguien ya ha resuelto este problema.

(He intentado hacerse pasar por un usuario administrador en el panel de configuración de IIS ASP.net, pero que no funcionó bien.)

Actualización: no puede instalarlo en la GAC ​​ya sea. Para dar una analogía, este servicio web ofrece una vista simplificada de una aplicación de terceros, p. Starteam. No puedo (no debería tener que ... no quiero) copiar todos los archivos binarios de esa carpeta en la carpeta bin o instalarlos en el GAC

+0

¡Estoy teniendo el mismo problema y no puedo encontrar una solución! ¿Has logrado solucionar esto? Estoy usando .NET 3.5. Parece un error similar a http://support.microsoft.com/kb/812832. – dtroy

Respuesta

0

Siempre puede colocar los ensamblados a los que hace referencia en GAC, entonces la ubicación no importaría. Puede instalar el componente arrastrándolo al GAC (C: \ windows \ assembly) o ejecutando GACUtil.exe.

Este artículo puede ayudar. Describe el "Best Practices for Assembly Loading".

Al principio pensé que podría usar el elemento <probing privatePath="bin\debug"/> en el tiempo de ejecución/assemblyBinding en el archivo web.config, pero la búsqueda solo le permitirá especificar subdirectorios en la ubicación raíz.

-1

Puede poner en GAC y acceder desde allí.

+0

lea el final de mi pregunta ... – Gishu

+0

¿Buena respuesta? o mejor borrado? – Kiquenet

0

Creo que también puede hacer referencia a rutas de ensamblaje específicas en el código.

AppDomain.CurrentDomain.AppendPrivatePath("C:\\NotMyCode"); 

Haciendo eso en su Global.asax Application_Start debería hacer el truco.

+0

AppendPrivatePath es obsoleto, de acuerdo con MSDN: http://msdn.microsoft.com/en-us/library/system.appdomain.appendprivatepath.aspx –

+0

Eso debe haber sido en 3.5 .. Todavía estoy fuertemente 2.0 desafortunadamente. PrivateBinPath entonces ... Lo mismo ... – davewasthere

14

De acuerdo con la MSDN documentation,

ensamblados de referencia fuera el directorio raíz de la aplicación deben tener nombres fuertes y deben ser ya sea instalado en la caché de ensamblados global o especificado usando el elemento <codeBase>.

Por lo tanto, podría parecer que no tiene suerte. Esto es lo que probaría:

  1. Cree un NTFS junction point en el directorio base de la aplicación que apunta al directorio que contiene su código compartido. Este es el paso clave. Por ejemplo, en el directorio base de su aplicación, ejecute linkd SharedCode c:\NotMyCode. Esto hace que <yourappbase>\SharedCode sea efectivamente un alias para c:\NotMyCode.
  2. Tell ASP.NET para buscar conjuntos en esta ruta, utilizando un elemento <probing>, que hace referencia al punto de unión SharedCode. Como esto está bajo su base de aplicación, debería funcionar. Alternativamente, use AppDomainSetup.PrivateBinPath para establecer la ruta explorada para los ensambles.

estoy bastante curiosidad por ver si esto funciona :-)

+0

+1 por sigilo ... no sabía de linkd. Logró engañar al explorador de Windows pero no a ASP.Net. ASP.net copia los binarios en una ubicación temporal desde donde se ejecuta. Lo extraño es que la ubicación temporal muestra estos archivos; sin embargo, FusionLogVw no muestra una entrada para una resolución de ensamblaje fallida. Pero el servidor responde con un FileNotFound como de costumbre ... – Gishu

+0

Eso es un fastidio :-( –

+1

podemos desactivar shadow coping al directorio temporal ... pero no me gusta la solución JUNCTION es como hack ... \ –

Cuestiones relacionadas