
Ας πούμε ότι έχουμε μία λύση με την ακόλουθη δομή:


* Project.DAL - στρώμα πρόσβασης δεδομένων, εξαρτάται από μια βιβλιοθήκη χαμηλότερου επιπέδου, π.χ. Oracle.DataAccess w / αντιγραφή τοπική = true
* Project.BLL - Επιχειρήσεις λογική στρώμα, αναφορές Project.DAL το σχέδιο
* Project.UI - στρώμα UI, συγκεντρώνει σε εκτελέσιμο, αναφορές Project.BLL, προεπιλογή του έργου


Όταν Project.UI καταρτίζεται, VS είναι αρκετά έξυπνος για να αντιγράψετε Project.DAL.dll στον κατάλογο εξόδου, αλλά δεν είναι αρκετά έξυπνος για να καταλάβω ότι ήθελα Oracle.DataAccess να αντιγραφεί στον κατάλογο εξόδου, καθώς και για τη διανομή στους πελάτες .


Μπορεί κανείς να εξηγήσει γιατί συμβαίνει αυτό; Μήπως επειδή βλέπει Oracle.DataAccess στο Συμβούλιο Γενικών Υποθέσεων και υποθέτει ότι οι πελάτες θα έχουν στο GAC, καθώς;


Δεν είναι ότι μεγάλο ζήτημα, αλλά είναι κάπως ενοχλητικό ότι κάθε φορά που μπορώ να προσθέσω μια νέα αναφορά συνέλευση, θα πρέπει να θυμηθείτε να το ρυθμίσετε να αντιγράψετε τις τοπικές και πρόσθεσε ένα στοιχείο για να το αντιγράψετε σε σενάριο κατασκευή μου. 

 
Πώς Visual Studio καθορίσει τι πρέπει να αντιγράψετε στον κατάλογο εξόδου με λύσεις πολλαπλών έργων;
====================================================================================================



Ναι, το Visual Studio θα αντιγράψετε ένα αρχείο DLL με την πορεία εξόδου σε οποιαδήποτε από τις δύο προϋποθέσεις κατωτέρω:


1. Το αρχείο DLL αναφέρεται ρητά με CopyLocal = true
2. Το αρχείο DLL αναφέρεται χωρίς CopyLocal ή έμμεσα μέσω κάποιου άλλου DLL που αναφέρεται **και δεν είναι στο GAC**


Ο λόγος για τον οποίο δεν θα αντιγράψει τοπικής όταν το αρχείο είναι στο GAC, είναι ότι κατά την επίλυση ονομάτων συνέλευση η GAC έχει ύψιστη προτεραιότητα, δηλαδή ακόμα και αν έχετε ένα (διαφορετικό) τοπικό αντίγραφο, θα χρησιμοποιείται η έκδοση από το Συμβούλιο Γενικών Υποθέσεων.


Σας προτείνω να δημιουργήσει έναν κατάλογο βιβλιοθήκης όπου θα τεθούν όλα τα εξωτερικά συγκροτήματα που αναφέρονται. Στη συνέχεια θα δημιουργήσει μια δέσμη ενεργειών αυτόματης MSBuild σε έναν υπολογιστή (ή VM) που δεν έχουν την Oracle-αρχείο gac'ed (ούτε Visual Studio εγκατασταθεί για αυτή την χάρη). Με αυτόν τον τρόπο, το αρχείο θα αντιγραφεί στην κατασκευή, και θα έχετε περισσότερο έλεγχο πάνω στο τι γίνεται ό, τι όταν χρησιμοποιείτε VS.

 

Ακόμη ένα πράγμα.


Όταν **δεν χρησιμοποιείτε το DLL που αναφέρεται στον κώδικά σας** σε όλα, θα αγνοήσει την CopyLocal και **δεν θα αντιγράψει** το στον κατάλογο εξόδου σας.

 

Είχα μια περίεργη κατάσταση όπου ακόμη κι αν το σύστημα ήταν μια αναφορά έργου και αναφέρεται με το «Copy Local» εμφανίζονται ως «αληθινή» στο παράθυρο ιδιοτήτων αναφοράς, το αρχείο DLL δεν είχε αντιγραφεί στον κατάλογο εξόδου. Είχα μια παλαιότερη έκδοση του DLL στο GAC, αλλά εγώ δεν βλέπω γιατί αυτό θα πρέπει να αποφευχθεί η DLL που αντιγράφεται.


Βρήκα ότι η εκφόρτωση του έργου και με το χέρι την επεξεργασία του XML αναφορά του έργου ως εξής:



```
<ProjectReference Include="..\SomeProject.csproj">
  <Project>{11111111-1111-1111-1111-111111111111}</Project>
  <Name>Some Project Name</Name>
  <Private>True</Private>
</ProjectReference>

```

Η DLL έχει αντιγραφεί στον κατάλογο των εξόδων τους, όπως αναμενόταν. Βρήκα ότι ακριβώς ρύθμιση Αντιγραφή Τοπικά σε True στο παράθυρο ιδιοτήτων σήμαινε το `<Private>`στοιχείο ήταν εντελώς λείπει, αλλά στην περίπτωση αυτή να οριστεί σε ψευδή ήταν παρούσα με τιμή «False».

 

@RenniePet Εδώ είναι μια σύνδεση με ένα blog που περιγράφει την RenniePet μέθοδο που περιγράφεται σε ένα σχόλιο παραπάνω (αν δεν θέλετε να επεξεργαστείτε το αρχείο έργο σας με το χέρι, όπως προτείνεται @Shaun):


<http://blogs.msdn.com/b/jjameson/archive/2009/11/18/the-copy-local-bug-in-visual-studio.aspx>

 