ฉันจะแก้ไขข้อผิดพลาดในการคอมไพล์ของ Visual Studio“ ไม่ตรงกันระหว่างสถาปัตยกรรมตัวประมวลผล” ได้อย่างไร


458

ฉันใหม่กับการกำหนดค่าโครงการใน Visual Studio 2010 แต่ฉันได้ทำการวิจัยบางอย่างแล้วและยังไม่สามารถสรุปปัญหานี้ได้ ฉันมีโซลูชัน Visual Studio พร้อม C ++ DLL อ้างอิง C # DLL C # DLL อ้างอิง DLLs อื่น ๆ บางตัวอยู่ในโครงการของฉันและจากภายนอก เมื่อฉันพยายามคอมไพล์ C ++ DLL ฉันจะได้รับคำเตือนนี้:

เตือน MSB3270: มีความไม่ตรงกันระหว่างสถาปัตยกรรมตัวประมวลผลของโครงการที่กำลังสร้าง "MSIL" และสถาปัตยกรรมตัวประมวลผลของการอ้างอิง "[internal C # dll]", "x86"

มันบอกให้ฉันไปที่เครื่องมือจัดการการกำหนดค่าเพื่อจัดตำแหน่งสถาปัตยกรรมของฉัน C # DLL ถูกตั้งค่าด้วยแพลตฟอร์มเป้าหมาย x86 ถ้าฉันพยายามเปลี่ยนสิ่งนี้เป็นอย่างอื่นเช่น CPU ใด ๆ ก็บ่นเพราะหนึ่งใน DLLs ภายนอกมันขึ้นอยู่กับมีเป้าหมายแพลตฟอร์ม x86

เมื่อฉันดูเครื่องมือจัดการการกำหนดค่าจะแสดงแพลตฟอร์มสำหรับ C # DLL ของฉันเป็น x86 และสำหรับโครงการ C ++ ของฉันเป็น Win32 ดูเหมือนว่าการตั้งค่าที่ถูกต้อง แน่นอนฉันไม่ต้องการให้โครงการสำหรับโครงการ C ++ ของฉันมีแพลตฟอร์มที่กำหนดเป็น x64 ซึ่งเป็นตัวเลือกอื่นที่นำเสนอเท่านั้น

ฉันทำอะไรผิดที่นี่


การร้องเรียนคืออะไรโดยเฉพาะเมื่อคุณเปลี่ยนเป็น CPU ใด ๆ
lordcheeto

2
ฉันไม่มีข้อมูลเพียงพอที่จะให้คำแนะนำที่มีข้อมูล แต่คลิกขวาที่โซลูชันของคุณ -> คำสั่งการสร้างโครงการและตรวจสอบให้แน่ใจว่าโครงการ C # ของคุณกำลังถูกสร้างขึ้นก่อนโครงการ C ++ หากไม่ใช่ให้ไปที่แท็บการพึ่งพาและแจ้งให้ VS ทราบว่าโครงการ C ++ ขึ้นอยู่กับโครงการ C #
lordcheeto

2
Visual Studio เป็นอึกับเรื่องนี้อีกครั้ง แพลตฟอร์มที่ด้านบนของหน้าจอของฉันบอกว่า x64 แต่คำเตือนบอกว่าโครงการที่กำลังสร้างนั้นคือ "MSIL" ดังนั้น Visual Studio จึงบอกฉันว่ามีความไม่ตรงกันระหว่างแอปเปิ้ลกับส้มเมื่อฉันไม่ได้ใช้แอปเปิ้ล เราสามารถเปลี่ยนชื่อเป็น Visual Stupido ได้หรือไม่?
Paul McCarthy

เท่าที่ฉันกังวลนี่เป็นข้อผิดพลาดใน Visual Studio ฉันเลือก x64 เป็นเป้าหมายแพลตฟอร์มและบอกฉันว่าฉันกำลังสร้างโครงการสำหรับ MSIL
Paul McCarthy

คำตอบสั้น ๆ คือหากโครงการของคุณมีการพึ่งพา x86 หรือ x64 คุณไม่สามารถใช้ CPU ใด ๆ (ซึ่งเป็นเพียงสำหรับแอปพลิเคชัน. NET บริสุทธิ์) ดังนั้นคุณต้องสร้างสำหรับ x64 หรือ x32 ไม่ใช่ CPU ใด ๆ นี่มาจากคำตอบ
zar

คำตอบ:


512

คำเตือนนี้ดูเหมือนว่าจะมีการนำมาใช้กับ Visual Studio 11 Beta ใหม่และ. NET 4.5 แม้ว่าฉันคิดว่ามันอาจเป็นไปได้มาก่อน

ครั้งแรกมันเป็นเพียงการเตือน มันไม่ควรทำร้ายอะไรเลยถ้าคุณแค่จัดการกับการพึ่งพา x86 Microsoft กำลังพยายามเตือนคุณเมื่อคุณระบุว่าโครงการของคุณเข้ากันได้กับ "CPU ใด ๆ " แต่คุณมีการอ้างอิงในโครงการหรือแอสเซมบลี. dll ที่เป็น x86 หรือ x64 เนื่องจากคุณมีการพึ่งพา x86 ดังนั้นโครงการของคุณจึงไม่รองรับ "CPU ใด ๆ " หากต้องการให้คำเตือนหายไปคุณควรเปลี่ยนโครงการของคุณจาก "CPU ใด ๆ " เป็น "x86" มันง่ายมากที่จะทำนี่คือขั้นตอน

  1. ไปที่รายการเมนู Build | เครื่องมือจัดการการกำหนดค่า
  2. ค้นหาโครงการของคุณในรายการภายใต้แพลตฟอร์มจะพูดว่า "CPU ใด ๆ "
  3. เลือกตัวเลือก "Any CPU" จากเมนูแบบเลื่อนลงจากนั้นเลือก <New..>
  4. จากช่องโต้ตอบนั้นให้เลือก x86 จากดร็อปดาวน์ "แพลตฟอร์มใหม่" และตรวจสอบให้แน่ใจว่าได้เลือก "CPU ใด ๆ " ในเมนูแบบเลื่อนลง "คัดลอกการตั้งค่าจาก"
  5. กดตกลง
  6. คุณจะต้องเลือก x86 สำหรับการกำหนดค่า Debug และ Release

สิ่งนี้จะทำให้การเตือนหายไปและระบุว่าแอสเซมบลีหรือโครงการของคุณไม่สามารถใช้งานได้กับ "CPU ใด ๆ " อีกต่อไป แต่ตอนนี้เฉพาะ x86 นอกจากนี้ยังสามารถใช้งานได้หากคุณกำลังสร้างโครงการ 64 บิตที่มีการพึ่งพา x64 คุณจะเลือก x64 แทน

หมายเหตุอื่น ๆ โปรเจ็กต์สามารถเข้ากันได้กับ "CPU ใด ๆ " โดยปกติแล้วหากเป็นโปรเจ็กต์ pure .NET ปัญหานี้เกิดขึ้นเมื่อคุณแนะนำการพึ่งพา (dll บุคคลที่สามหรือโครงการที่มีการจัดการ C ++ ของคุณเอง) ที่กำหนดเป้าหมายสถาปัตยกรรมโปรเซสเซอร์ที่เฉพาะเจาะจง


3
ฉันเพิ่งติดตั้ง RTW ของ Visual Studio 2012 และเปิดโซลูชัน 2010 ที่มีอยู่ก่อนแล้วและเริ่มเห็นคำเตือนเดียวกันดังนั้นจึงเป็นสิ่งที่ยังคงมีอยู่ใน RTW
Tod Thomson

4
ดังที่กล่าวไว้ฉันคิดว่าคำตอบของเดวิดถูกต้องคำเตือนนี้บอกให้คุณรู้ว่าแอปของคุณไม่ใช่ "AnyCPU" ดังนั้นคุณจะพบปัญหาเมื่อคุณปรับใช้กับสถาปัตยกรรมที่ผิด
Tod Thomson

6
มันเป็นสิ่งที่ดีมาก An CPU exe ใด ๆ จะโหลดเป็น x64 บนระบบปฏิบัติการ 64 บิตและไม่สามารถโหลด x86 ได้ ดังนั้นหากคุณมีการพึ่งพาแพลตฟอร์มใดแพลตฟอร์มหนึ่งคุณควรตั้งค่าแพลตฟอร์มของคุณให้ถูกต้อง
Yaur

1
ดูเหมือนว่าเมนูสร้างจะหายไปใน VS C # 2010 Express ฉันจะไปได้อย่างไร ฉันหวังว่าพวกเขาจะไม่ปิดบัง
Xonatron

1
เพิ่งค้นพบวิธีการเปิดใช้งานเมนู
บิลด์

144

นี่เป็นคำเตือนที่ดื้อมากและในขณะที่มันเป็นคำเตือนที่ถูกต้องมีบางกรณีที่ไม่สามารถแก้ไขได้เนื่องจากการใช้ส่วนประกอบของบุคคลที่สามและเหตุผลอื่น ๆ ฉันมีปัญหาที่คล้ายกันยกเว้นว่าคำเตือนเป็นเพราะแพลตฟอร์มโครงการของฉันคือ AnyCPU และฉันกำลังอ้างอิงไลบรารี MS ที่สร้างขึ้นสำหรับ AMD64 นี่คือใน Visual Studio 2010 โดยวิธีการและดูเหมือนจะได้รับการแนะนำให้รู้จักโดยการติดตั้ง VS2012 และ. Net 4.5

เนื่องจากฉันไม่สามารถเปลี่ยนไลบรารี MS ที่ฉันกำลังอ้างอิงได้และเนื่องจากฉันรู้ว่าสภาพแวดล้อมการปรับใช้เป้าหมายของฉันจะเป็น 64 บิตเท่านั้นฉันจึงสามารถเพิกเฉยต่อปัญหานี้ได้อย่างปลอดภัย

แล้วคำเตือนล่ะ? Microsoft โพสต์เพื่อตอบสนองต่อรายงานการเชื่อมต่อว่าหนึ่งตัวเลือกคือการปิดใช้งานคำเตือนนั้น คุณควรทำสิ่งนี้คือคุณตระหนักถึงสถาปัตยกรรมโซลูชันของคุณมากและคุณเข้าใจเป้าหมายการปรับใช้ของคุณอย่างเต็มที่และรู้ว่าไม่ใช่ปัญหานอกสภาพแวดล้อมการพัฒนา

คุณสามารถแก้ไขไฟล์โครงการของคุณและเพิ่มกลุ่มคุณสมบัตินี้และการตั้งค่าเพื่อปิดการเตือน:

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>

1
เพียงอื่น ๆ อ้างอิงอย่างเป็นทางการ MS เพื่อแก้ปัญหานี้ที่ผมเคยเห็นอยู่ในไฟล์ Microsoft .NET Framework 4.5 RC Readme มันถูกลบออกอย่างน่าประหลาดใจจากไฟล์ RTM Readme
JohnC

4
ใช้งานได้ แต่ไม่ใช่สำหรับรูปแบบของคำเตือน: "แอสเซมบลีที่อ้างอิง ... กำหนดเป้าหมายโปรเซสเซอร์ที่แตกต่างจากแอปพลิเคชัน" มันจะดีถ้ามีการตั้งค่าที่คล้ายกันสำหรับคำเตือนนี้?
จิมมี่

6
"แพลตฟอร์มโครงการของฉันคือ AnyCPU และฉันกำลังอ้างอิงไลบรารี MS ที่สร้างขึ้นสำหรับ AMD64" ... นี่มันผิด เนื่องจากการปรับใช้เป้าหมายของคุณเป็น 64- บิตเสมอคุณสามารถตั้งค่าแพลตฟอร์มของคุณเป็น x64 ซึ่งทำให้เกิดข้อผิดพลาดที่เหมาะสมมากขึ้นถ้าสมมติฐาน 64- บิตของคุณเคยละเมิดและยังป้องกันการเตือน
Ben Voigt

2
@ BenVoigt เป็นแนวคิดที่ดีในทางทฤษฎี แต่ VS การเป็นกระบวนการ x86 นั้นจำเป็นต้องมี x86 builds of control เพื่อให้ทำงานเหมือนกับ Windows Forms Designer แม้ว่าแอปพลิเคชันของคุณจะเป็น 64 บิตก็ตาม เป็นเหตุผลที่ถูกต้อง แต่โชคไม่ดีที่จะใช้บิลด์ "Any CPU" ใด ๆ ที่เป็นเท็จ
jrh

1
@jrh: จากนั้นให้ใส่ GUI ในโปรเจ็กต์ DLL และสร้างมันเป็น AnyCPU EXE จะต้องมีการทำเครื่องหมายด้วยสถาปัตยกรรมที่เหมาะสมเพื่อให้ตรงกับการพึ่งพาพื้นเมือง การแยก GUI ที่เหมาะสมจากลอจิกไปได้ไกล (แม้ว่ามันจะยังมีข้อ จำกัด อยู่เช่นเมื่อโค้ดเนทีฟทำการเรนเดอร์ส่วนหนึ่งของ GUI แต่การสนับสนุนนักออกแบบนั้นเป็นสาเหตุที่หายไป x86 และ x64)
Ben Voigt

61

กฎง่ายๆคือ "open DLLs, EXEs ที่ปิด" นั่นคือ:

  • EXEกำหนดเป้าหมายระบบปฏิบัติการโดยการระบุ x86 หรือ x64
  • DLLsนั้นเปิดทิ้งไว้ (เช่น AnyCPU) เพื่อให้สามารถสร้างอินสแตนซ์ได้ภายในกระบวนการแบบ 32 บิตหรือ 64 บิต

เมื่อคุณสร้าง EXE เป็น AnyCPU สิ่งที่คุณทำคือเลื่อนการตัดสินใจว่าจะใช้พยานหลักฐานในกระบวนการใดใน OS ซึ่ง JIT EXE จะชื่นชอบ นั่นคือ x64 OS จะสร้างกระบวนการ 64 บิต x86 OS จะสร้างกระบวนการ 32 บิต

สร้าง DLLs เป็น AnyCPU ทำให้เข้ากันได้กับกระบวนการใดกระบวนการหนึ่ง

สำหรับข้อมูลเพิ่มเติมเกี่ยวละเอียดปลีกย่อยของการโหลดประกอบให้ดูที่นี่ บทสรุปผู้บริหารอ่านบางอย่างเช่น:

  • AnyCPU - โหลดเป็นชุด x64 หรือ x86 ขึ้นอยู่กับกระบวนการที่เรียกใช้
  • x86 - โหลดเป็นชุดประกอบ x86; จะไม่โหลดจากกระบวนการ x64
  • x64 - โหลดเป็นชุดประกอบ x64; จะไม่โหลดจากกระบวนการ x86

4
กฎนี้สมเหตุสมผลสำหรับฉัน แต่ให้พิจารณาสถานการณ์ต่อไปนี้: Native.dll (x64) ที่ใช้โดย NetA.dll (CPU ใด ๆ ) ที่ใช้โดย NetB.dll (CPU ใด ๆ ) ที่ใช้โดย App1.exe (x64) ไม่มีปัญหาจริงที่นี่ แต่รวบรวม NetA.dll ทำให้ฉันเตือน ตกลงเนื่องจากชุดประกอบนี้โดยตรงขึ้นอยู่กับ Native.dll ฉันสามารถทำเครื่องหมายเป็น x64 ได้เช่นกัน แต่แล้วการรวบรวม NetB.dll บ่น ฉันต้องการให้ NetB.dll เป็น "CPU ใด ๆ " เพราะเป็นแอสเซมบลีทั่วไปที่ใช้ในแอปพลิเคชัน pure-dot-net ที่แตกต่างกัน ฉันสรุปได้ว่าตัวเลือกเดียวของฉันคือการระงับ / เพิกเฉยต่อคำเตือน ใช่?
Steve Robbins

2
เนื่องจากการพึ่งพา Native.dll บนแอปพลิเคชัน / แอสเซมบลีไลน์ทั้งหมดของคุณตอนนี้คือ x64 ไม่ว่าคุณจะหยุดการเตือนหรือไม่ ในขณะที่การปราบปรามทำงานในสถานการณ์ของคุณสถานการณ์แปลก ๆ อาจเกิดขึ้นในอนาคต ตัวอย่างเช่น 1) ชุดประกอบ NetB ใช้ในสภาพแวดล้อม x86 โดยที่ Nativex64 จะไม่โหลดหรือ 2) ลูกค้าของคุณต้องการ App1.exe รุ่น x86 และคุณรวบรวมอย่างมีความสุขเนื่องจาก NetB ถูกทำเครื่องหมายเป็น CPU ใด ๆ แต่อีกครั้ง Nativex64 ที่ด้านบนสุดของสแต็กจะไม่โหลด
Gustavo Mori

แม้ว่ากฎของกุสตาโวเป็นหลักการที่ดี แต่ก็ไม่สามารถใช้สำหรับปัญหาเฉพาะที่ถามในคำถามนี้ได้เนื่องจากโครงการมีการพึ่งพาแอสเซมบลีของบุคคลที่สามที่ไม่ปฏิบัติตามกฎแล้ว (เป็น x86 ไม่ใช่ AnyCPU) ดังนั้นตราบใดที่การพึ่งพามีห่วงโซ่ทั้งหมดของโครงการจะต้องกำหนดเป้าหมาย x86 และไม่มีอะไรอื่น
David Burg

23

C # DLL ถูกตั้งค่าด้วยแพลตฟอร์มเป้าหมาย x86

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

DLLs ไม่มีตัวเลือกพวกเขาจำเป็นต้องเข้ากันได้กับกระบวนการเป็นพยาน หากพวกเขาไม่ได้แล้วคุณจะได้รับ Kaboom ขนาดใหญ่ที่มี BadImageFormatException เมื่อรหัสของคุณพยายามที่จะใช้พวกเขา

ดังนั้นการเลือกที่ดีสำหรับ DLLs คือ AnyCPU เพื่อให้ทำงานได้ทั้งสองวิธี ที่ทำให้จำนวนของความรู้สึกที่กำลังสำหรับ C # พวกเขาทำงานทางใดทางหนึ่ง แต่ไม่แน่ใจว่าไม่ใช่ DLL แบบผสม C ++ / CLI ของคุณ แต่ก็มีรหัสที่ไม่มีการจัดการที่สามารถทำงานได้ดีเมื่อกระบวนการทำงานในโหมด 32 บิต คุณสามารถรับระบบการสร้างเพื่อสร้างคำเตือนเกี่ยวกับสิ่งนั้น ซึ่งเป็นสิ่งที่คุณได้รับ เพียงแค่คำเตือนมันยังคงสร้างอย่างถูกต้อง

เพียงแค่ถ่อปัญหา ตั้งค่าเป้าหมายแพลตฟอร์มของโครงการ EXE เป็น x86 มันจะไม่ทำงานกับการตั้งค่าอื่น ๆ และเก็บโครงการ DLL ทั้งหมดไว้ที่ AnyCPU


1
ดังนั้นเพื่อความชัดเจน: ฉันไม่ได้สร้าง EXE ฉันกำลังสร้าง DLL เพื่อให้ทำงานกับ EXE ของคนอื่น การเปลี่ยนเป้าหมายแพลตฟอร์มของ C # DLLs เป็น CPU ใด ๆ ไม่ได้เป็นการกำจัดคำเตือน ฉันสงสัยว่านี่เป็นกรณีของconnect.microsoft.com/VisualStudio/feedback/details/728901/ หรือไม่ - ฉันจะไม่สนใจคำเตือน แต่ในความเป็นจริง EXE สามารถโหลด C # DLL แต่ไม่ใช่ C ++ DLL ดังนั้นฉันคิดว่านี่เป็นปัญหาที่แท้จริง
พอล Eastlund

คุณใช้ VS2010 จริงๆหรือ ยังไม่ชัดเจนเลยว่าคุณไม่สามารถโหลด C ++ / CLI DLL ได้ การวินิจฉัยคืออะไร? อัปเดตคำถามของคุณด้วยข้อมูลที่จำเป็นนี้
Hans Passant

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

1
คุณไม่ได้บันทึกข้อผิดพลาดหรือข้อยกเว้นใด ๆ ที่เกี่ยวข้องกับการโหลด DLL ฉันไม่สามารถช่วยคุณได้ถ้าคุณไม่บอกสิ่งที่คุณรู้ ขอให้โชคดีกับมัน
Hans Passant

5

ฉันได้รับคำเตือนแบบเดียวกันฉันทำสิ่งนี้:

  1. ยกเลิกการโหลดโครงการ
  2. แก้ไขคุณสมบัติของโครงการเช่น. csproj
  3. เพิ่มแท็กต่อไปนี้:

    <PropertyGroup>
        <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
            None
        </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
    </PropertyGroup>
  4. รีโหลดโครงการ


2
นี่ไม่ใช่การแก้ปัญหา เพียงแค่ปิดการใช้งานคำเตือนสำหรับโครงการเฉพาะ แต่ในบางกรณีฉันคิดว่ามันเป็นทางออกที่ถูกต้อง ขอบคุณ!
เล็ก ๆ

4

ฉันมีปัญหานี้ในวันนี้และเพียงแค่ดูการกำหนดค่าสิ่งปลูกสร้างใน Visual Studio ไม่ได้ช่วยเพราะมันแสดง CPU ใด ๆ สำหรับทั้งโครงการที่ไม่ได้สร้างและโครงการอ้างอิง

ฉันดูใน csproj ของโครงการอ้างอิงและพบสิ่งนี้:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>

ยังไงก็ตาม PlatformTarget นี้ได้รับการเพิ่มในช่วงกลางของการเปลี่ยนแปลงการกำหนดค่าและ IDE ดูเหมือนจะไม่เห็นมัน

การลบบรรทัดนี้ออกจากโครงการที่อ้างอิงแก้ปัญหาของฉันได้


ฉันใช้เวลาทั้งวันเพื่อหาสิ่งนี้ ขอบคุณมาก! :)
SohamC

3

ถ้า C # DLL ของคุณมีการพึ่งพา x86 แสดงว่า DLL ของคุณนั้นจะต้องเป็น x86 ฉันไม่เห็นวิธีรอบ ๆ VS บ่นเกี่ยวกับการเปลี่ยนเป็น (เช่น) x64 เพราะไฟล์แบบ 64 บิตไม่สามารถโหลดไลบรารีแบบ 32 บิต

ฉันสับสนเล็กน้อยเกี่ยวกับการกำหนดค่าของโครงการ C ++ ข้อความเตือนที่ให้ไว้สำหรับการสร้างแสดงให้เห็นว่ามันเป็นเป้าหมายสำหรับ AnyCPU เพราะรายงานว่าแพลตฟอร์มที่เป็นเป้าหมายคือ [MSIL] แต่คุณระบุว่าการกำหนดค่าสำหรับโครงการนั้นเป็น Win32 จริงๆ แอป Win32 ดั้งเดิมไม่ควรเกี่ยวข้องกับ MSIL - แม้ว่ามันอาจจะต้องมีการรองรับ CLR หากเปิดใช้งานการโต้ตอบกับไลบรารี C # ดังนั้นฉันคิดว่ามีช่องว่างเล็กน้อยในด้านข้อมูล

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


3

นอกจากนี้ในการตอบกระสอบเดวิดคุณยังอาจจะต้องไปที่Buildแท็บProject Propertiesและการตั้งค่าPlatform Targetการx86สำหรับโครงการที่จะให้คุณคำเตือนเหล่านี้ แม้ว่าคุณอาจคาดหวังว่าจะเป็นเช่นนั้นการตั้งค่านี้ดูเหมือนจะไม่ซิงโครไนซ์อย่างสมบูรณ์แบบกับการตั้งค่าในเครื่องมือจัดการการกำหนดค่า


2

สำหรับโครงการ C # เป้าหมายของ x86 ทำในสิ่งที่ดูเหมือน มันบอกว่าการชุมนุมครั้งนี้รองรับสถาปัตยกรรม x86 เท่านั้น เช่นเดียวกันสำหรับ x64 ซีพียูใด ๆ ในทางกลับกันบอกว่าฉันไม่สนใจสถาปัตยกรรมที่ฉันสนับสนุนทั้งสอง ดังนั้นคำถามที่ 2 ต่อไปคือ (1) การกำหนดค่าของปฏิบัติการที่ใช้ DLLs เหล่านี้คืออะไร? และ (2) พยานคืออะไรของระบบปฏิบัติการ / คอมพิวเตอร์ของคุณ? เหตุผลที่ฉันถามคือเพราะถ้าปฏิบัติการของคุณถูกคอมไพล์ให้ทำงานใน 64- บิตแล้วมันต้องพึ่งพาทั้งหมดเพื่อให้สามารถทำงานในโหมด 64- บิตเช่นกัน ชุดประกอบ CPU ใด ๆ ของคุณควรสามารถโหลดได้ แต่อาจอ้างอิงถึงการอ้างอิงอื่นที่มีความสามารถในการทำงานในการกำหนดค่า x86 เท่านั้น ตรวจสอบการอ้างอิงทั้งหมดและการพึ่งพาการพึ่งพาเพื่อให้แน่ใจว่าทุกอย่างเป็น "CPU ใด ๆ " หรือ "x64" หากคุณวางแผนที่จะรันไฟล์ปฏิบัติการในโหมด 64 บิต มิฉะนั้นคุณจะมีปัญหา

ในหลาย ๆ วิธี Visual Studio ไม่ได้ทำการรวบรวมส่วนผสมของ CPU ใด ๆ และแอสเซมบลีขึ้นอยู่กับสถาปัตยกรรมต่าง ๆ ได้ง่าย เป็นไปได้ แต่มักจะต้องการให้แอสเซมบลีที่เป็นอย่างอื่น "CPU ใด ๆ " จะต้องรวบรวมแยกต่างหากสำหรับ x86 และ x64 เพราะบางพึ่งพา - แห่ง - พึ่งพาอาศัยที่ไหนสักแห่งมีสองรุ่น


การกำหนดค่าของเรื่องที่สามารถดำเนินการได้นั้นเกี่ยวข้องหรือไม่เนื่องจากฉันได้รับความล้มเหลวในการพยายามสร้าง DLLs หรือไม่? (มันคือ x86) คอมพิวเตอร์ของฉันคือ x64
พอล Eastlund

2
มันเป็นปฏิบัติการที่กำหนดว่าพยานจะใช้อะไร หากไฟล์เรียกทำงานกำลังรันเป็น x64 ดังนั้นทุกอย่างที่โหลด (โดยตรงหรือโดยอ้อม) จะต้องเป็น x64 หรือ CPU ใด ๆ หากไฟล์เรียกทำงานกำลังรันเป็น x86 ดังนั้นทุกอย่างจะโหลด (โดยตรงหรือโดยอ้อม) ต้องเป็น x86 หรือ CPU ใด ๆ
Jonathan DeCarlo

1

ฉันเคยมีปัญหาที่คล้ายกันมาก่อนโดยเฉพาะเมื่อเพิ่มโซลูชันทดสอบลงในโซลูชัน x64 ที่มีอยู่เช่น SharePoint ในกรณีของฉันดูเหมือนว่าจะเกี่ยวข้องกับความจริงที่ว่าเทมเพลตโครงการบางอย่างถูกเพิ่มเป็นแพลตฟอร์มที่แน่นอนโดยค่าเริ่มต้น

นี่คือวิธีแก้ปัญหาที่มักใช้งานได้สำหรับฉัน: ตั้งค่าทุกอย่างเป็นแพลตฟอร์มที่ถูกต้องในเครื่องมือจัดการการกำหนดค่า (ดรอปดาวน์การกำหนดค่าที่ใช้งานอยู่ Debug ตามปกติเป็นวิธีที่ดีในการเข้าถึง) และแพลตฟอร์มโครงการ (ในคุณสมบัติโครงการ) สร้างจากนั้นตั้งค่าทุกอย่างกลับเป็น AnyCPU บางครั้งฉันต้องลบและเพิ่มการอ้างอิง (DLLs ใน Properties ของแต่ละโครงการ) และบางครั้ง "Run ทดสอบในกระบวนการ 32 บิตหรือ 64 บิต" (ดับเบิลคลิก Local.testsettings และไปที่ Hosts)

สำหรับฉันแล้วดูเหมือนว่านี่เป็นเพียงการตั้งค่าบางสิ่งจากนั้นตั้งค่ากลับคืนมา แต่อาจมีอะไรเกิดขึ้นมากกว่าเบื้องหลังที่ฉันไม่เห็น มันทำงานค่อนข้างสม่ำเสมอสำหรับฉันในอดีตแม้ว่า


1

สำหรับโครงการของฉันฉันมีข้อกำหนดที่จะสามารถสร้างทั้ง x86 และ x64 ปัญหาของเรื่องนี้คือเมื่อใดก็ตามที่คุณเพิ่มการอ้างอิงในขณะที่ใช้มันก็จะบ่นเมื่อคุณสร้างอื่น ๆ

โซลูชันของฉันคือแก้ไขไฟล์ * .csproj ด้วยตนเองเพื่อให้บรรทัดเช่นนี้:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"/>

รับการเปลี่ยนแปลงนี้:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral"/>

1

ฉันมีปัญหาคล้ายกันมันเกิดจาก MS UNIT Test DLL แอปพลิเคชัน WPF ของฉันรวบรวมเป็น x86 แต่หน่วยทดสอบ DLL (ไฟล์ EXE อ้างอิง) เป็น "Any CPU" ฉันเปลี่ยนหน่วยการทดสอบ DLL ให้คอมไพล์แล้วสำหรับ x86 (เหมือนกับ EXE) และได้รับการแก้ไขใหม่



0

ควรมีวิธีในการสร้าง. NET EXE / DLL AnyCPU และ DLLs ที่ไม่มีการจัดการใด ๆ ขึ้นอยู่กับการคอมไพล์ด้วย x86 และ x64 ทั้งสองรวมกันอาจมีชื่อไฟล์ต่างกันจากนั้นโมดูล. NET โหลดแบบไดนามิกที่ถูกต้อง สถาปัตยกรรมตัวประมวลผล นั่นจะทำให้ AnyCPU มีประสิทธิภาพ หาก C ++ DLL รองรับเฉพาะ x86 หรือ x64 เท่านั้น AnyCPU นั้นไม่มีจุดหมายแน่นอน แต่แนวคิดทั้งชุดที่ฉันยังไม่เห็นจะนำมาใช้เนื่องจากตัวจัดการการกำหนดค่าไม่ได้ให้ความหมายในการสร้างโครงการเดียวกันสองครั้งด้วยการกำหนดค่า / แพลตฟอร์มที่แตกต่างกันสำหรับการรวมกลุ่มหลายรายการที่อนุญาตให้ AnyCPU


2
ยินดีต้อนรับสู่ stackoverflow! คุณสามารถพยายามโฟกัส / ปรับรูปแบบคำตอบนี้ได้ไหม?
Corley Brigman

ดูเหมือนว่ามันจะทำให้เป็นคำถามที่ดีหรือโพสต์บล็อกหรือคำขอคุณสมบัติในการเชื่อมต่อ ... มันไม่ได้ตอบคำถามนี้
Ben Voigt

0

ฉันมีคำเตือนที่คล้ายกันมากในงานสร้างของฉัน โครงการของฉันถูกตั้งค่าเป็นเป้าหมาย. NET 4.5 บนเซิร์ฟเวอร์บิลด์ติดตั้ง Windows 8.1 SDK (สำหรับ. NET 4.5.1) หลังจากอัปเดตโครงการของฉันเพื่อกำหนดเป้าหมาย. NET 4.5.1 (ไม่ใช่ปัญหาสำหรับฉันคือสำหรับแอปพลิเคชันใหม่ทั้งหมด) ฉันไม่ได้รับคำเตือนอีกต่อไป ...


0

ฉันแก้ไขคำเตือนนี้เพื่อเปลี่ยน "เครื่องมือจัดการการกำหนดค่า" เป็นรีลีส (ผสม Plataform)


0

ฉันได้รับคำเตือนนี้ใน Visual Studio 2012 เมื่อรวบรวมงานสคริปต์ไปป์ไลน์ของ SQL Server 2012 SP1 SSIS - จนกว่าฉันจะติดตั้ง SQL Server 2012 SP2


0

ฉันมีปัญหาเดียวกันกับการเชื่อมต่อการเปิด SQLite และการใช้ Nuget และการติดตั้งส่วนประกอบที่ใช้ในโครงการ (SQLite) แก้ไขได้! ลองติดตั้งองค์ประกอบของคุณด้วยวิธีนี้และตรวจสอบผลลัพธ์


0

ใช้https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build#directorybuildprops-example :

  • เพิ่มไฟล์Directory.Build.propsไปยังโฟลเดอร์โซลูชันของคุณ
  • วางในที่นี้:
<Project>
 <PropertyGroup>
   <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
 </PropertyGroup>
</Project>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.