วิธีทำให้ Visual Studio คัดลอกไฟล์ DLL ไปยังไดเร็กทอรีเอาต์พุต


102

ฉันมีโปรเจ็กต์ Visual Studio C ++ ที่อาศัยไฟล์ DLL ภายนอก ฉันจะทำให้ Visual Studio คัดลอกไฟล์ DLL นี้ลงในไดเร็กทอรีเอาต์พุต (debug / release) โดยอัตโนมัติได้อย่างไรเมื่อฉันสร้างโครงการ

คำตอบ:


92

ใช้การดำเนินการหลังการสร้างในโครงการของคุณและเพิ่มคำสั่งเพื่อคัดลอก DLL ที่ละเมิด การดำเนินการหลังการสร้างถูกเขียนเป็นสคริปต์ชุดงาน

ไดเร็กทอรีเอาต์พุตสามารถอ้างถึงเป็น$(OutDir). ไดเร็กทอรีโปรเจ็กต์มีให้ในรูปแบบ$(ProjDir). พยายามใช้ pathes สัมพัทธ์หากทำได้เพื่อให้คุณสามารถคัดลอกหรือย้ายโฟลเดอร์โครงการของคุณได้โดยไม่ทำลายการดำเนินการหลังการสร้าง


26
นอกจากนี้ยังควรชี้ให้เห็นว่าเขาสามารถตั้งค่าเหตุการณ์หลังการสร้างผ่าน Project> Properties> Build Events> Post-Build Event
Phil Booth

21
ตัวอย่าง: eyeung003.blogspot.com/2009/11/…
AntonioR

38
ในกรณีที่ลิงก์ขาด: "xcopy / y" $ (ProjectDir) *. dll "" $ (OutDir) "
เอซ

ฉันเปลี่ยนข้างต้นเป็นวิธีที่ฉันใช้คำสั่งเป็นการส่วนตัวในอินสแตนซ์ของฉัน นี่จะ; คัดลอกไฟล์แบบอ่านอย่างเดียวที่ใช้ได้ดีกับการควบคุมแหล่งที่มาและสร้างไดเร็กทอรีเป้าหมาย (โดยปกติไม่จำเป็น) -> xcopy "$ (ProjectDir) *. dll" "$ (OutDir)" / i / r / y
กินที่ Joes

8
เพิ่มแฟล็ก / d ลงใน xCopy เพื่อป้องกันการคัดลอกไฟล์ที่ไม่ได้เปลี่ยนแปลงโดยไม่จำเป็นในไดเร็กทอรีเอาต์พุต
Zoey

45

$ (OutDir) กลายเป็นพา ธ สัมพัทธ์ใน VS2013 ดังนั้นฉันต้องรวมกับ $ (ProjectDir) เพื่อให้ได้เอฟเฟกต์ที่ต้องการ:

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

BTW คุณสามารถดีบักสคริปต์ได้อย่างง่ายดายโดยการเพิ่ม 'echo' ที่จุดเริ่มต้นและสังเกตข้อความที่ขยายในหน้าต่างสร้างผลลัพธ์


3
$ (TargetDir) สามารถแทนที่ $ (ProjectDir) $ (OutDir) ได้เนื่องจากเป็นการรวมกันของทั้งสองอย่าง
person27

ในกรณีของฉันที่ไม่มี / d มันแสดงข้อผิดพลาด Access Denied แต่ / d ตามเอกสารเป็นวันที่ ไม่แน่ใจว่าเป็นการเชื่อมต่ออะไร
Ravi C

1
การเพิ่ม / d จะป้องกันการเขียนทับหากไฟล์ต้นฉบับเก่ากว่าหรือเหมือนกับไฟล์ที่มีอยู่ ข้อผิดพลาดถูกปฏิเสธการเข้าถึงอาจเกิดขึ้นหากเป้าหมายถูกล็อกโดยกระบวนการอื่น
Rich Shealer

7

รายละเอียดในส่วนความคิดเห็นด้านบนใช้ไม่ได้สำหรับฉัน (VS 2013) เมื่อพยายามคัดลอกเอาต์พุต dll จากโปรเจ็กต์ C ++ หนึ่งไปยังรีลีสและโฟลเดอร์ดีบักของโปรเจ็กต์ C # อื่นภายในโซลูชันเดียวกัน

ฉันต้องเพิ่ม post build-action ต่อไปนี้ (คลิกขวาที่โปรเจ็กต์ที่มีเอาต์พุต. dll) จากนั้นคุณสมบัติ -> คุณสมบัติคอนฟิกูเรชัน -> สร้างเหตุการณ์ -> เหตุการณ์หลังการสร้าง -> บรรทัดคำสั่ง

ตอนนี้ฉันเพิ่มสองบรรทัดนี้เพื่อคัดลอก dll ผลลัพธ์ลงในสองโฟลเดอร์:

xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug

5

(คำตอบนี้ใช้ได้กับ C # เท่านั้นไม่ใช่ C ++ ขออภัยฉันอ่านคำถามเดิมผิด)

ฉันเคยผ่านนรก DLL แบบนี้มาก่อน ทางออกสุดท้ายของฉันคือการจัดเก็บ DLL ที่ไม่มีการจัดการใน DLL ที่มีการจัดการเป็นทรัพยากรไบนารีและแยกไฟล์เหล่านั้นไปยังโฟลเดอร์ชั่วคราวเมื่อโปรแกรมเปิดใช้งานและลบออกเมื่อถูกกำจัด

นี่ควรเป็นส่วนหนึ่งของโครงสร้างพื้นฐาน. NET หรือ pinvoke เนื่องจากมีประโยชน์มาก .... ทำให้ DLL ที่มีการจัดการของคุณจัดการได้ง่ายทั้งการใช้ Xcopy หรือการอ้างอิงโครงการในโซลูชัน Visual Studio ที่ใหญ่กว่า เมื่อคุณทำสิ่งนี้แล้วคุณไม่ต้องกังวลเกี่ยวกับเหตุการณ์หลังการสร้าง

อัพเดท:

ฉันโพสต์รหัสที่นี่ในคำตอบอื่นhttps://stackoverflow.com/a/11038376/364818


1
ฉันเห็นด้วยควรเป็นส่วนหนึ่งของเฟรมเวิร์ก (เพื่อเชื่อมโยง dlls แบบคงที่ ฯลฯ ) - ควรสังเกตว่าการจัดเก็บ dll เป็นทรัพยากรแล้วแยกออกที่รันไทม์อาจทำให้เกิดปัญหาในสภาพแวดล้อมขององค์กรบางอย่าง (โดยเฉพาะอย่างยิ่งหากมีความเป็นธรรม ซอฟต์แวร์ป้องกันไวรัสเชิงรุก)
BrainSlugs83

1

เพิ่ม builtin COPY ในไฟล์project.csproj :

  <Project>
    ...
    <Target Name="AfterBuild">
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
    </Target>
  </Project>

มีข้อผิดพลาดในระยะยาวสำหรับ VS โปรดใช้ ProjectDir แทน SolutionDir
John_J

0
xcopy /y /d  "$(ProjectDir)External\*.dll" "$(TargetDir)"

คุณยังสามารถอ้างถึงเส้นทางสัมพัทธ์ตัวอย่างถัดไปจะพบ DLL ในโฟลเดอร์ที่อยู่เหนือโฟลเดอร์โครงการ หากคุณมีโปรเจ็กต์หลายโปรเจ็กต์ที่ใช้ DLL ในโซลูชันเดียวสิ่งนี้จะวางซอร์สของ DLL ในพื้นที่ส่วนกลางที่สามารถเข้าถึงได้เมื่อคุณตั้งค่าโปรเจ็กต์ใดโปรเจ็กต์ใด ๆ เป็นโปรเจ็กต์เริ่มต้น

xcopy /y /d  "$(ProjectDir)..\External\*.dll" "$(TargetDir)"

/yสำเนาตัวเลือกโดยไม่มีการยืนยัน /dตรวจสอบตัวเลือกที่จะดูว่าไฟล์ที่มีอยู่ในเป้าหมายและถ้ามันไม่สำเนาเฉพาะในกรณีที่แหล่งที่มีการประทับเวลาใหม่กว่าเป้าหมาย

ฉันพบว่าอย่างน้อยใน Visual Studio เวอร์ชันที่ใหม่กว่าเช่น VS2109 $(ProjDir)นั้นไม่ได้กำหนดไว้และต้องใช้$(ProjectDir)แทน

การออกจากโฟลเดอร์เป้าหมายในxcopyควรดีฟอลต์เป็นไดเร็กทอรีเอาต์พุต สิ่งสำคัญคือการเข้าใจเหตุผล$(OutDir)เพียงอย่างเดียวไม่เป็นประโยชน์

$(OutDir)อย่างน้อยใน Visual Studio เวอร์ชันล่าสุดถูกกำหนดให้เป็นพา ธ สัมพัทธ์ไปยังโฟลเดอร์ผลลัพธ์เช่นbin/x86/Debug. การใช้เพียงอย่างเดียวเป็นเป้าหมายจะสร้างชุดโฟลเดอร์ใหม่โดยเริ่มจากโฟลเดอร์ผลลัพธ์ของโครงการ เช่น: … bin/x86/Debug/bin/x86/Debug.

การรวมเข้ากับโฟลเดอร์โครงการจะช่วยให้คุณไปยังตำแหน่งที่เหมาะสม เช่น: $(ProjectDir)$(OutDir).

อย่างไรก็ตาม$(TargetDir)จะจัดเตรียมไดเร็กทอรีเอาต์พุตในขั้นตอนเดียว

รายการแมโคร MSBuild ของ Microsoft สำหรับ Visual Studio เวอร์ชันปัจจุบันและเวอร์ชันก่อนหน้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.