2008-11-10 22 views
13

En proyectos de sitio web de Visual Studio (en Visual Studio 2005 o posterior, no proyectos de aplicaciones web donde aún hay un archivo .csproj) cómo se almacena la información de referencia, y es posible controlarla sin control almacenar binarios compilados en el control de fuente?Rutas de referencia del sitio web de Visual Studio

Si hace clic con el botón derecho en un proyecto de sitio web y selecciona Páginas de propiedades, la primera pantalla (Referencias) enumera todas las referencias del proyecto.

Las referencias de sistema * se enumeran como tipo GAC y otros archivos DLL se pueden enumerar como BIN o proyecto.

El problema se produce cuando se incluye algo como una referencia del proyecto y, a continuación, se compromete a control de código fuente (para nosotros, Subversion, haciendo caso omiso de .dll y .pdb.)

Otro desarrollador obtiene código actualizado desde el repositorio y tiene que configurar manualmente todas estas referencias de proyecto, pero ni siquiera puedo determinar dónde se almacena esta información, a menos que esté en ese .suo, que NO es amigable con el control de fuente.

Respuesta

18

Si hace referencia a un archivo .dll por nombre de archivo a través de la pestaña de exploración, debería haber un archivo .refresh creado (anidado bajo el dll en BIN). Los colocamos en SVN y funciona muy bien (puede que tenga que editarlos manualmente para usar rutas relativas).

Referencias adicionales de la ficha .NET se añaden a web.config

Proyectos de referencia se almacenan en el archivo de solución (.sln). Abra el archivo .sln y verá una lista de ellas:

Project("{xxxxxxx-7377-xxxx-xxxx-BC803B73C61A}") = "XXXXXXX.Web", "XXXXXXX.Web", "{xxxxxxxx-BB14-xxxx-B3B6-8BF6D8BC5AFF}" 
    ProjectSection(WebsiteProperties) = preProject 
     TargetFramework = "3.5" 
     ProjectReferences = "{xxxxxxxx-C3AB-xxxx-BBED-2055287036E5}|XXXXXX.Data.dll; 
      ... 
+0

Gracias hombre! Siempre tuve un problema con las referencias del proyecto y no noté que el archivo sln está cambiando cuando agregué la referencia del proyecto. –

0

utilizo copyprojectDll.ps1 PowerShell.

Mi estructura de carpetas está por debajo

  • ClassLibraries
    Terceros
    sitio web/Bin
    CopyprojectDll.ps1
    Website.sln

ClassLibraries son clases de código para mi proyecto, DAL. El proyecto del sitio web incluye solo archivos web, aspx, aspx.cs .. Terceros se requieren bibliotecas, etc. AjaxToolkit

puedo compilar ClassLibraries.sln corro CopyprojectDll.ps1 utilizo Website.sln después de esto.

El archivo de muestra de powershell está a continuación.

$ folders = @(); $ carpetas + = "IB.Security" $ carpetas + = "ClassLibraries/Core.Classes"

función CopyDllsToWebBin ($) dll_files { if ($ dll_files -eq $ null) { retorno; } $ targetfolder = "./ Kod/bin/"

foreach($dll in $dll_files) 
{ 

    copy-item $dll.FullName -destination "$targetfolder" -force #-Verbose 
} 

}

función CopyDllsToThirdParty ($ dll_files) {

$ TargetFolder =" ./ThirdParty/"

foreach($dll in $dll_files) 
{ 
    copy-item $dll.FullName -destination "$targetfolder" -force #-Verbose 
} 

}

$ dll_output_folder = "/ bin/debug";

foreach ($ carpeta en $ carpetas) { $ dll_files = Get-ChildItem -Path $ carpeta $ dll_output_folder -include * .dll -Recurse | sort-object Nombre CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path $ carpeta $ dll_output_folder -include * .pdb -Recurse | sort-object Nombre CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path $ carpeta $ dll_output_folder -include * .xml -Recurse | tipo-objeto Nombre CopyDllsToWebBin ($) dll_files "carpeta $ $ copiado dll_output_folder"

}

$ dll_files = Get-ChildItem -path -include "Terceros" * .dll -Recurse | sort-object Nombre CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path "ThirdParty" -include * .pdb -Recurse | sort-object Nombre CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path $ carpeta $ dll_output_folder -include * .xml -Recurse | tipo-objeto Nombre CopyDllsToWebBin ($ dll_files)

"copiado Terceros"

fecha

16

proyectos “Sitio Web” en Visual Studio son una cosa extraña. Parecen ser un intento de atender a los desarrolladores web tradicionales, donde un "sitio" es solo un conjunto de archivos en un directorio. De la misma manera, cuando haces un proyecto de "Sitio web" en Visual Studio, no hay un archivo de "proyecto" real, como los proyectos de C# tienen un archivo .csproj. Sin embargo, todavía hay un archivo de solución (.sln). Normalmente, las referencias de ensamblaje .dll se guardan en el archivo de proyecto. Dado que un sitio web no tiene uno, ¿a dónde van?

Las referencias a otros proyectos

Si se agrega una referencia a otro proyecto, a continuación, una entrada se realizan en la solución .sln archivo. Se termina pareciéndose a esto: Referencias

Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "WebSite1", "..\..\WebSites\WebSite1\", "{F25DB9D6-810D-4C18-ACBB-BFC420D33B20}" 
ProjectSection(WebsiteProperties) = preProject 
TargetFramework = "3.5" 
ProjectReferences = "{11666201-E9E8-4F5A-A7AB-93D90F3AD9DC}|ClassLibrary1.dll;" 

sistema de archivos

Si navega con el sistema de archivos y agrega un archivo .dll, a continuación, Visual Studio creará un “.REFRESH” archivo con el mismo nombre en la carpeta \ Bin. Este archivo es solo un archivo de texto de 1 línea que indica la ruta desde la que se cargó el archivo. Entonces, por ejemplo, si agregué "MyAssem.dll" de .... \ libs, en la carpeta del sitio web \ Bin, terminaría con 2 archivos copiados allí: MyAssem.dll y MyAssem.dll.refresh. El archivo .refresh contendría el texto: ".... \ libs". En cada compilación, Visual Studio verificará la ruta en el archivo .refresh, y si existe un .dll más nuevo allí, sobrescribirá el que está en el directorio Bin.

Advertencia: Visual Studio NO arrojará un error si el archivo no existe donde lo pide el archivo .refresh. Simplemente continuará usando el .dll que ya está en la carpeta \ Bin. Sin embargo, emitirá una advertencia.

GAC Referencias

Si se agrega un ensamblado de la caché de ensamblados global, Visual Studio entrará en el archivo Web.config, así:

<compilation debug="false"> 
<assemblies> 
    <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 

De nuevo Lo que hay que observar aquí es que Visual Studio asume que si el ensamblado estaba en el GAC en su computadora de desarrollo, ¡estará en el mismo lugar en el tiempo de ejecución! Eso puede ocasionarle problemas si tiene instalado Oracle.DataAccess en su máquina de desarrollo, lo que lo colocaría en el GAC, pero cuando implemente, simplemente copie el .dll en su lugar en la máquina de producción. Todavía intentará encontrarlo en el GAC y puede fallar en el tiempo de ejecución.

Espero que esto ayude a aclarar las rarezas de los sitios web y cómo funcionan las referencias.

+0

Publicación de blog muy útil sobre el tema. Gracias. –

+0

Desafortunadamente, el enlace parece que ya no está activo. – lgaud

+0

@lgaud: oops lo siento, acabo de desactivar mi alojamiento que esto fue publicado esta mañana. Aunque hice una copia en alguna parte ... Si puedo encontrarla, actualizaré mi respuesta con el texto completo en lugar de un enlace. – CodingWithSpike

Cuestiones relacionadas