2009-05-13 17 views
5

Tengo un proyecto de Visual Studio que se basa en varias referencias de DLL. Este es un ejemplo de esas referencias en mi csproj:¿Cómo hacer que Visual Studio deje de copiar archivos DLL durante la compilación sin mi permiso?

<ItemGroup> 
    <Reference Include="Class1.Project1"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project1.dll</HintPath> 
    <Private>False</Private> 
    </Reference> 
    <Reference Include="Class1.Project2"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project2.dll</HintPath> 
    <Private>False</Private> 
    </Reference> 
</ItemGroup> 

Sin embargo, cuando incluyo esta clase como una dependencia de proyecto en un proyecto de sitio web, Visual Studio es encontrar las dependencias de las dependencias que se muestran arriba. Durante la compilación, Visual Studio está configurando por defecto la propiedad "Copiar local" en "Verdadero" y copiando estas dependencias en el directorio ~/bin de mi sitio web.

Esto, a su vez, está sobrescribiendo las versiones de los archivos DLL que ya existen en este directorio. Esto hace que el siguiente error:

Could not load file or assembly 'Class5.Project5, Version=3.6.1861.2, Culture=neutral, PublicKeyToken=dfeaee0e3978ac79' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

¿Cómo hago Visual Studio defecto, la indicación "Copia Local" a "falso" para todo ? No quiero que Visual Studio copie los archivos DLL automáticamente durante la compilación. Tampoco quiero atar mi compilación a muy versiones específicas de una DLL.

Respuesta

1

Tenía este problema de una vez,

En Publicar: La forma más fácil de evitar que la escritura sobre los archivos DLL existentes es para establecer como de sólo lectura. Recibirá una advertencia de publicación para cada archivo que no podría ser reemplazado, pero hará el trabajo.

En compilación: Para configurar CopyLocal automáticamente, debe colocar los archivos dll en el GAC.

0

¿Por qué había otras versiones en el directorio bin?

En cualquier caso, me pregunto si tendrías el mismo problema al usar un proyecto de aplicación web. Como es un proyecto, tiene un solo archivo que enumera las referencias directas, y si se trata de referencias de proyectos (referencias a la salida de otros ensamblados en la misma solución), entonces MSBUILD puede garantizar que se use la versión correcta.

Vea si puede reproducir esto comenzando con un nuevo proyecto de aplicación web y simplemente agregando las referencias.

2

Me parece que tiene varios proyectos configurados para mostrar en el mismo directorio. ¿Es cierto?

En caso afirmativo, deberá revisar su configuración como se supone en Visual Studio (no, requiere) que cada proyecto tenga un único directorio de salida.

También, usted escribió:

This, in turn, is overwriting the versions of the DLL files that already exist in this directory.

dónde estos archivos existentes vienen?

Visual Studio asume que tiene todos los derechos para realizar los cambios que considere adecuados en los directorios de salida de compilación. Tratar de discutirlo es una buena ruta para un nuevo mundo de dolor.

(Desafortunadamente, hablo por experiencia. Suspiro.)

+0

VS no requiere que cada proyecto tenga un único directorio de salida. Donde trabajo tenemos más de 1,000 proyectos que dan salida a todo en un solo directorio bin. (El truco consiste en crear sus referencias desde este directorio de salida.) Usamos nant para llenar los requisitos previos de compilación y limpiar el directorio de salida entre compilaciones de depuración y liberación. Probablemente no sea una mejor práctica, pero ciertamente funciona. –

+0

Muy interesante! Cuando probé esto, con VS2003, encontré que la compilación fallaba porque los archivos en el directorio de salida estaban en uso, mantenidos abiertos por un proyecto cuando otro estaba tratando de aclarar las cosas. ¿Qué versión de Visual Studio estás usando? – Bevan

0

puede probar con el siguiente en el archivo de proyecto.

<ReferenceOutputAssembly>false</ReferenceOutputAssembly> 

Y luego, en su código, pruebe esto.

<ItemGroup> 
    <Reference Include="Class1.Project1"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project1.dll</HintPath> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </Reference> 
    <Reference Include="Class1.Project2"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project2.dll</HintPath> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </Reference> 
</ItemGroup> 
Cuestiones relacionadas