ฉันมีโปรเจ็กต์ Visual Studio C ++ ที่อาศัยไฟล์ DLL ภายนอก ฉันจะทำให้ Visual Studio คัดลอกไฟล์ DLL นี้ลงในไดเร็กทอรีเอาต์พุต (debug / release) โดยอัตโนมัติได้อย่างไรเมื่อฉันสร้างโครงการ
ฉันมีโปรเจ็กต์ Visual Studio C ++ ที่อาศัยไฟล์ DLL ภายนอก ฉันจะทำให้ Visual Studio คัดลอกไฟล์ DLL นี้ลงในไดเร็กทอรีเอาต์พุต (debug / release) โดยอัตโนมัติได้อย่างไรเมื่อฉันสร้างโครงการ
คำตอบ:
ใช้การดำเนินการหลังการสร้างในโครงการของคุณและเพิ่มคำสั่งเพื่อคัดลอก DLL ที่ละเมิด การดำเนินการหลังการสร้างถูกเขียนเป็นสคริปต์ชุดงาน
ไดเร็กทอรีเอาต์พุตสามารถอ้างถึงเป็น$(OutDir)
. ไดเร็กทอรีโปรเจ็กต์มีให้ในรูปแบบ$(ProjDir)
. พยายามใช้ pathes สัมพัทธ์หากทำได้เพื่อให้คุณสามารถคัดลอกหรือย้ายโฟลเดอร์โครงการของคุณได้โดยไม่ทำลายการดำเนินการหลังการสร้าง
$ (OutDir) กลายเป็นพา ธ สัมพัทธ์ใน VS2013 ดังนั้นฉันต้องรวมกับ $ (ProjectDir) เพื่อให้ได้เอฟเฟกต์ที่ต้องการ:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
BTW คุณสามารถดีบักสคริปต์ได้อย่างง่ายดายโดยการเพิ่ม 'echo' ที่จุดเริ่มต้นและสังเกตข้อความที่ขยายในหน้าต่างสร้างผลลัพธ์
รายละเอียดในส่วนความคิดเห็นด้านบนใช้ไม่ได้สำหรับฉัน (VS 2013) เมื่อพยายามคัดลอกเอาต์พุต dll จากโปรเจ็กต์ C ++ หนึ่งไปยังรีลีสและโฟลเดอร์ดีบักของโปรเจ็กต์ C # อื่นภายในโซลูชันเดียวกัน
ฉันต้องเพิ่ม post build-action ต่อไปนี้ (คลิกขวาที่โปรเจ็กต์ที่มีเอาต์พุต. dll) จากนั้นคุณสมบัติ -> คุณสมบัติคอนฟิกูเรชัน -> สร้างเหตุการณ์ -> เหตุการณ์หลังการสร้าง -> บรรทัดคำสั่ง
ตอนนี้ฉันเพิ่มสองบรรทัดนี้เพื่อคัดลอก dll ผลลัพธ์ลงในสองโฟลเดอร์:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(คำตอบนี้ใช้ได้กับ C # เท่านั้นไม่ใช่ C ++ ขออภัยฉันอ่านคำถามเดิมผิด)
ฉันเคยผ่านนรก DLL แบบนี้มาก่อน ทางออกสุดท้ายของฉันคือการจัดเก็บ DLL ที่ไม่มีการจัดการใน DLL ที่มีการจัดการเป็นทรัพยากรไบนารีและแยกไฟล์เหล่านั้นไปยังโฟลเดอร์ชั่วคราวเมื่อโปรแกรมเปิดใช้งานและลบออกเมื่อถูกกำจัด
นี่ควรเป็นส่วนหนึ่งของโครงสร้างพื้นฐาน. NET หรือ pinvoke เนื่องจากมีประโยชน์มาก .... ทำให้ DLL ที่มีการจัดการของคุณจัดการได้ง่ายทั้งการใช้ Xcopy หรือการอ้างอิงโครงการในโซลูชัน Visual Studio ที่ใหญ่กว่า เมื่อคุณทำสิ่งนี้แล้วคุณไม่ต้องกังวลเกี่ยวกับเหตุการณ์หลังการสร้าง
อัพเดท:
ฉันโพสต์รหัสที่นี่ในคำตอบอื่นhttps://stackoverflow.com/a/11038376/364818
เพิ่ม 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>
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 เวอร์ชันปัจจุบันและเวอร์ชันก่อนหน้า