Usar las mismas references de ensamblaje en csproj con diferentes estructuras de carpetas

Tengo un proyecto de C #, MyProject.csproj que se encuentra en una solución con la siguiente estructura de carpetas y hace reference a Dependency.dll:

  • Libs
    • Dependency.dll
  • Proyectos
    • Mi proyecto
      • MyProject.csproj

Por lo tanto, la reference a Dependency.dll en MyProject.csproj tiene un HintPath de algo como esto:

..\..\Libs\Dependency.dll 

Ahora me gustaría utilizar MyProject en una solución diferente en una estructura de proyecto diferente, sin modificaciones, como fuente. Esto se debe a que MyProject se encuentra en su propio repository de control de origen y lo estoy usando en diferentes soluciones como subpostitorios Mercurial / submodules de Git. (El problema podría resolverse en el nivel de control de origen …) Una solución tan diferente se vería así:

  • Libs
    • Dependency.dll
  • Mi proyecto
    • MyProject.csproj

Tenga en count que la carpeta MyProject ahora está en el mismo nivel que la carpeta Libs. Por lo tanto, el HintPath original ahora no es válido (ya que debería ser ..\Libs\Dependency.dll ) y obtengo errores de compilation.

¿Hay alguna manera de arreglar esto pero mantener el mismo csproj en las diferentes soluciones?

Encontré las siguientes soluciones posibles que son geniales pero requieren la modificación del csproj. Esto es principalmente posible en mi caso, pero a veces hay componentes externos en los que no puedo solicitar tales modificaciones, por lo que searchía una anulación de nivel de solución si es posible.

  • HintPath condicional basado en verificación de existencia de files: .csproj routes de sugerencias múltiples para un ensamblado Esto podría funcionar como para la mayoría de los casos, la estructura de la solución es bien conocida aquí.
  • Especificación de varias ubicaciones de búsqueda de ensamblaje: http://sofes.miximages.com/a/15816779/220230

Gracias.

Por ahora, resolví el problema usando la técnica descrita en este blogpost .

 <ItemGroup> <LibReferenceSearchPathFiles Include="..\..\Libs\**\*.dll"> <InProject>false</InProject> </LibReferenceSearchPathFiles> </ItemGroup> <Target Name="BeforeResolveReferences"> <RemoveDuplicates Inputs="@(LibReferenceSearchPathFiles->'%(RootDir)%(Directory)')"> <Output TaskParameter="Filtenetworking" ItemName="LibReferenceSearchPath" /> </RemoveDuplicates> <CreateProperty Value="@(LibReferenceSearchPath);$(AssemblySearchPaths)"> <Output TaskParameter="Value" PropertyName="AssemblySearchPaths" /> </CreateProperty> </Target> 

Esto permite que se carguen dlls de las subcarpetas de Libs. Si todos los dlls estarían en la raíz de la carpeta Libs, entonces el primer comodín se puede eliminar del valor Incluir.

Intereting Posts