2011-09-05 15 views
7

Tengo ProjectA (aplicación WPFA) que hace referencia a ProjectB (ClassLibrary). Dentro de ProjectB tengo la ventana wpf que usa el control de ThirdParty.dll que en consecuencia me refiero de ProjectB.La biblioteca a la que se hace referencia no se ha copiado

El problema es que no encuentra ThirdParty.dll en la carpeta de salida de ProjectA y exceprion xaml de análisis en tiempo de ejecución se eleva. No hay ThirdParty.dll en GAC. Copiar localmente está establecido en verdadero. Funciona si agrego manualmente en la carpeta de salida de ProjectA esa biblioteca y también funciona si uso ese ThirdParty.dll somwhere en mis archivos cs.

¿Cómo puedo resolver eso?

+7

Mire las propiedades de su referencia y compruebe si Copy Local está establecido en verdadero. – albertjan

+1

@the_ajp: debe agregar eso como una respuesta –

+0

Copy Local is true. –

Respuesta

4

La razón de esto es que visual studio solo copia recursos a la carpeta de salida si se establece Copy Local. Simplemente configure la referencia a Copy Local y debería estar bien.

Consulte este link sobre cómo funciona esto.

Cuando hace referencia a ProjectA, las referencias de ProjectB no se referencian automáticamente. Para que esto funcione, debe agregar una referencia a ThirdParty.dll desde ProjectA también si solo lo usa en XAML. El compilador no copia las referencias que solo se usan en XAML. Pero si los usa en el código, se copian.

Este es el mismo problema como se discutió here

+0

Pero está configurado como verdadero. –

+0

@Vladimir ver mi edición –

+0

Veo, pero ¿no es extraño que otras bibliotecas a las que se hace referencia también en ProjectB se copien pero esta no?¿O no se copia solo si se usa solo en xaml y no se usa directamente en el código .cs? –

1

Usted debe agregar la referencia a la DLL partido thrid al proyecto en el que desea que aparezca en el directorio de salida. Si Copy Local se establece en true, aparecerá en su directorio bin, ya sea que lo use o no en el código o xaml.

0

Añadir algo como esto para ProjectB.csproj:

<ItemGroup> 
    <Content Include="...\path\ThirdParty.dll"> 
     <Link>ThirdParty.dll</Link> 
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </Content> 
</ItemGroup> 

Esto convence VS copiar ThirdParty.dll a la carpeta de salida de ProjectA, también (sin necesidad de añadir nada a ProjectA acerca de ThirdParty.dll).
Todavía lo encuentro inadecuado porque si ThirdParty.dll está en un paquete NuGet, su ruta generalmente contiene el número de versión, que cambiará cuando actualice el paquete.
No lo he intentado todavía, pero no espero que NuGet actualice la ruta aquí como lo hace en <Reference>.

Cuestiones relacionadas