Visual Studio: Klasör yapısını kopyalamadan "Çıktı Dizinine Kopyalama" nasıl yapılır?


111

Proje klasörümün \ lib klasöründe birkaç dll dosyam var. Dll'nin özellik sayfasında "İçerik" olarak "Eylem Oluştur" ve "Her Zaman Kopyala" olarak "Çıktı Dizinine Kopyala" yı seçtim.

Oluşturulduktan sonra aslında dll'yi kopyalıyorum ama bunlar \ bin \ Release \ lib içinde ve \ bin \ Release konumunda değil.

Derleme sonrası bir komut dosyası yazmadan veya nant vb .'ye başvurmadan dll dosyalarını \ bin \ Release'e (\ bin \ Release \ lib'ye değil) kopyalamanın bir yolu var mı?

Yanıtlar:


256

<Content>kullanmak yerine <ContentWithTargetPath>hedef yolu belirtin ve şunun gibi:

<ItemGroup>
  <ContentWithTargetPath Include="lib\some_file.dat">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <TargetPath>some_file.dat</TargetPath>
  </ContentWithTargetPath>
</ItemGroup>

Bu girişin Visual Studio'dan (2012, 2015, 2017) görünmeyebileceğini, ancak csproj'a manuel olarak eklendikten sonra Visual Studio'da görüneceğini unutmayın. Hedef yol, kullanıcı arayüzü aracılığıyla düzenlenemeyecektir.


2
ContentWithTargetPath'i VS 2015'te Derleme Eylemi seçeneği olarak görmüyorum. Eklemenin bir yolu var mı?
Kim

1
Girişi .csproj dosyasına manuel olarak eklediğimde, IDE'de bir seçenek olarak görünüyor. Ancak yine de IDE'den Hedef Yolu düzenleyemiyorum.
Kim

9
Tek endişem, bunun MSBuild / .NET / Visual Studio / Whatever'in gelecekteki sürümlerinde desteklenmemesidir, çünkü VS2015 UI bu seçeneği veya TargetPath özelliğini göstermez.
MarioDS

1
Bu benim için çalışıyor. Diğer cevapların hiçbiri benim için işe yaramıyor. Cevap bu olmalı.
GunWanderer

1
Not olduğunu kullanılarak ContentWithTargetPath(VS 2017 15.9.9 üzerinde test) breaks artan derleme
Mads Ravn

26

Bunları içeride tutun $(ProjectDir)\Lib, ancak bu dosyaları .csproj dosyanızın köküne " bağlantı olarak " ekleyin. Şimdi, lib'de olmadan bin \ Debug'a (veya başka bir çıktı klasörüne) kopyalanacaklar.

DÜZENLEME: Bu yanıt, ContentWithTargetPath kullandığım VS / MSBuild sürümlerinde mevcut olmadığında yazılmıştı. VS'nin eski bir sürümünü kullanmak zorunda kalabilecek kişiler için bu yanıtı burada bırakıyoruz. Lütfen bu konuda yorum yapmayı bırakın, artık daha iyi yollar olduğunu biliyoruz.


4
Teşekkürler ananthonline. Adımlarını denedim ama yardımcı olmadı. Yanlış bir şey yapıyorum olabilir. İşte yaptığım şey, bir şeyin yanlış olduğunu düşünüyorsanız lütfen düzeltin: 1. Bu dll'leri projeden hariç tutun, ancak kütüphanede kalmalarına izin verin 2. Projeye sağ tıklayın ve "Mevcut öğeleri ekle" yi tıklayın. Lib'den dll'leri seçin ve "bağlantı" olarak ekleyin 3. Dll'leri sağ tıklayın ve "Çıktı Dizinine Kopyala" seçeneğinden "Her Zaman Kopyala" seçeneğini tekrar seçin. 4. Temizle ve Yeniden Oluştur. Sonuç: Bu
dll'leri

1
Lütfen yapılandırdıktan sonra çözüm klasörünüzün bir ekran görüntüsünü gönderin
Ani

3
Zaten proje ağacında bulunan bir dosyaya bir bağlantı eklemeye çalışırsam, reddeder ve bunun yerine dosyayı tekrar projeye dahil eder ...
Nyerguds

1
@Nyerguds gibi, zaten proje ağacında bulunan bir dosyaya bağlantı ekleyemediğinizi yaşıyorum, bu nedenle bu cevap soruyu çözmüyor.
Tore Østergaard

1
Çözüm Gezgini'nde proje dizininin kökünü doldurmuyor mu? Bu tür birçok dosyada sorun olabilir. Genellikle bir proje dizininin kökü zaten çok çeşitli dosyalar içerir.
Alex34758

10

Ana amacınız DLL'leri proje kök dizinini karıştırmadan dahil etmekse, başka bir çözüm de DLL'leri ayrı bir Paylaşılan Projeye taşımaktır ve bunu orijinal projeye referans olarak eklemektir.

(Bu yazının, klasörü ve proje yapısını korumadığı için bu soruyu doğrudan cevaplamadığını unutmayın, ancak bu yaklaşımı yararlı buldum çünkü benim durumumda projemi yeniden yapılandırabildim ve bazılarından kaçınmak istediğim için Buradaki diğer yaklaşımların dezavantajları.)

adımlar

  • Sağ tıklayın Solution -> Add -> New Project -> Shared Project
  • DLL'leri bu projeye ekleyin ("lib" alt klasörüne değil, bu projenin kök dizinine)
  • (DLL dosyası özelliklerinin doğru ayarlandığını kontrol edin, örn. Build Action: ContentVeCopy to Output Directory: Copy Always )
  • Orijinal projeye sağ tıklayın References -> Add Reference -> Shared Projects
  • Daha önce oluşturduğunuz paylaşılan projeyi seçin

Kurulum şuna benzer:

Çözelti-kaşif-ekran


2
Projeyi düzenli tutmak için açık ara basit ve zarif bir çözüm.
Ravi Ganesh

UAP ve * .bin dosyalarıyla çalışmasını sağlayamadım.
Matteo

7

Dll dosyalarını projeye referans olarak ve "Yerel kopyala" referans kümesinde true olarak ekleyin.


1
Teşekkürler Erik. Bu, referans olarak ekleyemediğim bir dll dışında mükemmel çalışıyor. Referans olarak eklerken aldığım hata 'libeay32.dll' referansı eklenemedi. Lütfen dosyanın erişilebilir olduğundan ve geçerli bir derleme veya COM bileşeni olduğundan emin olun.
OhDear

7
@MAnthony: Yalnızca .NET derlemeleri veya COM birlikte çalışma derlemeleri proje başvuruları olarak eklenebilir; yerel DLL'ler olamaz. DLL'yi \ bin \ Release'e kopyalamanın başka bir yolunu bulmanız gerekecek.
Michael Liu

Erik ve Michael ve ananthonline teşekkürler. Maalesef, gerekli itibar puanlarına sahip olmadığım için yanıtlarınıza ve yorumlarınıza ek oy veremiyorum.
OhDear

1
Yönetilmeyen DLL için aşağıda önerdiğim yöntemi kullanmanız gerekecek.
Ani

4

Dosyaları Libs dizininden VS2017 kök klasörüne kopyalamanız gerekirse:

<ItemGroup Condition="'$(Platform)' == 'x64'">
    <None Include="Libs\x64\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

Libs (RecursiveDir) klasörü dahil diğer herhangi bir klasöre

<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="mycustomfolder\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

3

VisualStudio 2015'te, 'bağlantıyla eklediğiniz' dll'ler aynı projenin bir alt klasöründeyse klasöründeyse, otomatik olarak bir klasöre yerleştirilecek ve çıktı da gördüğünüz gibi bir klasöre yerleştirilecek gibi görünüyor.

Dll'ler, projenin bir alt klasöründe olmayan diskteki başka bir proje veya dizindeyse, 'Bir bağlantı ile ekle' yapabilirsiniz ve bunlar kök dizine iyi bir şekilde yerleştirilecektir.


VS2012'de aynı. Onlara bağlantı yapmayı reddediyor ve sadece içerik olarak ekliyor. Sonunda, ne yazık ki en kolay çözüm onları proje köküne atmak gibi görünüyor.
Nyerguds

0

Alternatif bir yöntem, öğeleri tür olarak bırakmaktır None. Çözüm gezgininde, dağıtmak istediklerinizi tıklayın ve ContentözelliğiTrue .

Not: Bunu VS2019'da yaptım ve işler sürümden sürüme değişebilir.

Bunun çalışması için şimdi projenize sağ tıklayın ve "Projeyi Kaldır" ı seçin. Ardından, yüklenmemiş projeye sağ tıklayın ve "Proje_adı.vcxproj dosyasını düzenle" yi seçin.

Düzenleyicide, dosyanın sonuna kadar gidin ve bu hedefi, sondaki </Project>etiketin hemen önüne ekleyin :

  <Target Name="CopyContent" AfterTargets="Build">
    <Copy SourceFiles="@(None)" Condition="'%(None.DeploymentContent)' == 'true'" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
  </Target>

Şimdi kaldırılan projeye sağ tıklayın ve "Projeyi Yeniden Yükle" yi seçin. İstenirse kaydedip kapatmak için seçin.

Ayrıca şunu da ayarladım OutputDirectory:

$(SolutionDir)bin\$(Configuration)\$(Platform)\

ve IntermediateDirectoryiçin:

$(SolutionDir)obj\$(Configuration)\$(ProjectName)\$(Platform)\

Proje Özellikleri Genel sayfasında. Bu, çıktıyı bir "bin" klasörüne ve ara ürünleri çözümünüzün kök dizinindeki "obj" klasörüne yerleştirir.

Not: $(SolutionDir)MSBuild komut satırından çalıştırıldığında tanımlanmaz. GetDirectoryNameOfFileAbove kullanarak .sln dosyasının bulunduğu klasöre bunu tanımlamak için kullanabileceğiniz bir numara vardır. (okuyucu için alıştırma olarak bırakılmıştır). Ayrıca 2019'da bunu komut satırında zaten doğru bir şekilde ele alıyorlar gibi görünüyor. Evet :)$(SolutionDir) bir ters eğik çizgi, ondan sonra dolayısıyla hiçbiri bulunmaz. Her birinin sonuçlarının sonunda ters eğik çizgi olmalıdır.

Şimdi, Pro veya üstü sahibi iseniz, lütfen bunu her proje oluşturmanız gerektiğinde yapmayın. Bu berbat olur. Bunun yerine, proje kurulumunuzu tam istediğiniz gibi yaptıktan sonra seçin Project -> Export Template. Ona bir isim veriyorsunuz ve bir dahaki sefere bunun gibi bir proje oluşturmak istediğinizde, Yeni Proje iletişim kutusunda bu adı seçmeniz yeterli. (Eski versiyonda bunun olduğunu düşünüyorum Files -> Export Teamplate....)


-1

Visual Studio 2010 / C # Project ile aynı sorunu yaşadım.

Derlemeler için (yani .NET arayüzüne sahip olanlar) Çözüm Gezgini'nde projenizin altındaki "Başvurular" klasörünü kullanın. Sağ tıklayın, "Mevcut öğeyi ekle" yi seçin ve .dll derlemenizi bulun.

Yaygın .dll dosyaları bir alt klasöre yerleştirilebilir (yukarıda "\ lib" den bahsedildiği gibi) ve özelliklerde şunu seçin:

  • Build Action = "HelpFiles"
  • OutputDirectory'ye Kopyala = "Daha Yeniyse"

Bu benim için tam olarak istendiği gibi çalıştı - oluşturma sırasında, .DLL'ler "\ lib" alt klasörü olmadan çıktı dizinine kopyalanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.