ฉันจะแก้ไขข้อขัดแย้งของเวอร์ชันแอสเซมบลีกับ JSON.NET หลังจากอัปเดตการอ้างอิงแพ็คเกจ NuGet ในโครงการ ASP.NET MVC 5 ใหม่ได้อย่างไร


89

ฉันสร้างโครงการเว็บ ASP.NET MVC 5 ใหม่ใน VS 2013 (อัปเดต 1) จากนั้นอัปเดตแพ็คเกจ NuGet ทั้งหมด เมื่อฉันสร้างโครงการฉันได้รับคำเตือนต่อไปนี้:

คำเตือน MSB3243: ไม่มีวิธีใดในการแก้ไขความขัดแย้งระหว่าง "Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed" และ "Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed"

อย่างไรก็ตามเมื่อฉันตรวจสอบ web.config ฉันเห็นว่ามีการเปลี่ยนเส้นทางการผูก:

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
  </dependentAssembly>

ซึ่งเป็นสิ่งที่คำเตือนแนะนำ

ฉันจะแก้ไขคำเตือนนี้ได้อย่างไร


ใช่ฉันสร้างใหม่ทั้งหมด ฉันยังอัปเดต NuGet เป็นรุ่นล่าสุดสร้างโซลูชันใหม่และสร้างปัญหาเดียวกันซ้ำ
Jim Lamb

คำตอบ:


106

นี่คือขั้นตอนที่ฉันใช้เพื่อแก้ไขคำเตือน:

  • ยกเลิกการโหลดโครงการใน VS
  • แก้ไขไฟล์. csproj
  • ค้นหาการอ้างอิงทั้งหมดของ Newtonsoft.Json assembly
    • พบสองหนึ่งถึง v6 และหนึ่งถึง v5
    • แทนที่การอ้างอิงเป็น v5 ด้วย v6
  • โหลดโครงการใหม่
  • สร้างและสังเกตเห็นความล้มเหลวในการอ้างอิงการประกอบ
  • ดูข้อมูลอ้างอิงและพบว่าตอนนี้มีสองรายการใน Newtonsoft.Json ลบสิ่งที่ไม่สามารถแก้ไขได้
  • สร้างใหม่ - ไม่มีคำเตือน

12
ฉันพบการอ้างอิงสองรายการหนึ่งรายการสำหรับ v6 และอีกรายการสำหรับ v5 แต่ฉันลบ (ไม่ได้แทนที่) หนึ่งรายการสำหรับ v5 หลังจากนั้นฉันก็ไม่มีปัญหาใด ๆ เช่น "การอ้างอิงการประกอบล้มเหลว" หรือการอ้างอิงสองครั้งไปยัง Newtonsoft.Json ใน UI ฉันเดาว่ามีคนยัดinstall.ps1
ta.speot.is

ขอบคุณสำหรับการแก้ปัญหา ฉันลบการอ้างอิงรุ่นเก่าออกจากไฟล์โครงการด้วยและไม่มีปัญหา
Charles Prakash Dasari

31
+1 - มันทำให้ฉันแทบคลั่งเมื่อต้องทำอะไรแบบนี้ เป็นเหตุให้ฉันลังเลที่จะคลิกอัปเกรดบนตัวจัดการแพ็คเกจ nuget เสมอ
hylander0

1
ฉันประสบปัญหานี้และได้แก้ไขแล้วโดยลบข้อมูลอ้างอิงเพิ่มเติมที่ฉันไม่ทราบว่ามีอยู่ นี้คือการเชื่อมโยงกับข้อผิดพลาดการเชื่อมต่อ Microsoft ที่เป็นสาเหตุของการอ้างอิงพิเศษอยู่ที่นั่นไปนี้: connect.microsoft.com/VisualStudio/feedback/details/816725/...
Martin Costello

1
ในกรณีของฉันมีการอ้างอิงถึง Newtonsoft สองเวอร์ชันที่แตกต่างกัน Json 11.0.1 และ 11.0.2 แม้ว่าจะมีการบ่นเกี่ยวกับเวอร์ชัน 6.0
Daniel Lobo

31

ฉันมีปัญหานี้เนื่องจากฉันอัปเดตแพ็คเกจซึ่งรวมถึง Microsoft.AspNet.WebApi ที่มีการอ้างอิงถึง Newtonsoft.Json 4.5.6 และฉันได้ติดตั้งเวอร์ชัน 6 แล้ว มันไม่ฉลาดพอที่จะใช้เวอร์ชัน 6

ในการแก้ไขหลังจากอัปเดต WebApi ฉันเปิด Tools> NuGet Package Manager> Pacakge Manager Console และรัน:

 Update-Package Newtonsoft.Json

บันทึกแสดงให้เห็นว่าเวอร์ชัน 6.0.x และ 4.5.6 ทั้งหมดได้รับการอัปเดตเป็นเวอร์ชันล่าสุดและทุกอย่างเรียบร้อยดี

ฉันมีความรู้สึกนี้จะเกิดขึ้นอีกครั้ง


1
ฉันมีปัญหาของเวอร์ชันที่แตกต่างกันหลายเวอร์ชันในโซลูชันของฉันซึ่งมีหลายโครงการสิ่งนี้ได้รับการแก้ไขโดยสิ้นเชิงและอัปเดตทั้งหมดเป็น JSON.net ล่าสุด ดี!
c0d3p03t

1
นี่เป็นวิธีแก้ปัญหาที่ง่ายและตรงไปตรงมาที่สุดที่แก้ไขปัญหาของฉันได้ ขอบคุณ!
youngrrrr

21

ฉันพบว่าการลบส่วนนี้ออกจากไฟล์โครงการสามารถแก้ไขปัญหาได้

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>


นี่ไง. ฉันคิดว่าไม่มี Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 ตรงกับการเปลี่ยนเส้นทางที่มีผลผูกพัน '' oldVersion = "0.0.0.0-6.0.0.0" '' แต่ฉันไม่รู้ว่าจะเขียนอย่างไรให้ถูกต้อง
เพ้อฝัน

นี่เป็นปัญหาของฉันเช่นกันฉันไม่แน่ใจว่ามีอะไรเพิ่มเข้ามา
ความจำเสื่อม

ทำงานให้ฉัน ข้อผิดพลาดที่เกี่ยวข้องกับความขัดแย้งระหว่าง v6.0 และ v12.0 การอ้างอิงกลุ่มสินค้าคือ v11.0 ดังนั้นไม่แน่ใจว่าเกิดอะไรขึ้น แต่การลบกลุ่มรายการดูเหมือนจะแก้ไขได้แล้วเท่าที่ลบข้อผิดพลาดในการคอมไพล์
Brian.S

13

หากวิธีข้างต้นไม่ได้ผลให้ลองใช้สิ่งนี้ใน web.config หรือ app.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

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

13

ฉันอัปเกรดจาก Newtonsoft.Json 11.0.1 เป็น 12.0.2 การเปิดไฟล์โครงการใน Notepad ++ ฉันค้นพบทั้งสองอย่าง

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

และ

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

ฉันลบ ItemGroup ที่ตัดการอ้างอิงด้วยเส้นทางคำใบ้ไปยังเวอร์ชัน 11.0.1

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

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


1
นี่คือปัญหา ขอบคุณ!
George Fabish

8

วิธีแก้ไขขั้นสุดท้ายสำหรับข้อผิดพลาดในการเปลี่ยนเส้นทางแอสเซมบลีของคุณ

เอาล่ะหวังว่านี้จะช่วยแก้ปัญหาใด ๆ (สติ) ความแตกต่างอ้างอิงประกอบ ...

  1. ตรวจสอบข้อผิดพลาด

ท่องไปที่เว็บไซต์

  1. ตรวจสอบ web.config หลังจากการเปลี่ยนเส้นทางแอสเซมบลี สร้างใหม่หากไม่มีอยู่

การเปลี่ยนเส้นทางแอสเซมบลี web.config ที่มีอยู่

  1. คลิกขวาที่ข้อมูลอ้างอิงสำหรับแอสเซมบลีและเลือกคุณสมบัติ

การประกอบในรายการอ้างอิงในโครงการที่เกี่ยวข้อง

  1. ตรวจสอบเวอร์ชัน (ไม่ใช่เวอร์ชันรันไทม์) ในตารางคุณสมบัติ คัดลอกนั้น

ตารางคุณสมบัติแสดงเวอร์ชันของแอสเซมบลี

  1. วางในแอตทริบิวต์ newVersion

web.config assembly เปลี่ยนเส้นทางด้วย newVersion ที่อัปเดต

  1. เพื่อความสะดวกให้เปลี่ยนส่วนสุดท้ายของเวอร์ชันเก่าเป็นสิ่งที่สูงกลมและจินตนาการ

web.config assembly เปลี่ยนเส้นทางด้วย oldVersion ที่อัปเดต

ดีใจ.


คำตอบนี้ช่วยฉันได้ครั้งใหญ่! ฉันมีเว็บแอปพลิเคชันที่ใช้ไลบรารี C # ที่กำหนดเองทั้งคู่ใช้แพ็คเกจ nuget เดียวกัน แต่เว็บแอปพลิเคชันมีเวอร์ชันเก่ากว่าไลบรารีและการเปลี่ยนเส้นทางไม่รวมเวอร์ชันที่ไลบรารีใช้
War Gravy

4

จำไว้ว่าด้วยการเปลี่ยนเส้นทางที่มีผลผูกพัน

oldVersion = "0.0.0.0-6.0.0.0"

คุณกำลังบอกว่า dll เวอร์ชันเก่าอยู่ระหว่างเวอร์ชัน 0.0.0.0 และเวอร์ชัน 6.0.0.0


1
oldVersionเป็นคำเรียกผิดเล็กน้อยที่นี่จริง ๆ สิ่งที่คุณกำลังพูดคือแอสเซมบลี / exe ของคุณถูกสร้างขึ้นโดยอ้างอิงถึงเวอร์ชันในช่วง0.0.0.0-6.0.0.0และเวอร์ชันที่ติดตั้งจริง(และต้องการ) คือค่าภายใต้newVersion(เวอร์ชันเก่าจะใช้วลีได้ดีกว่า "รุ่นคาดว่า" และรุ่นใหม่จะได้รับการเรียบเรียงที่ดีกว่าเป็น "รุ่นที่ใช้ได้จริง")
nothingisnecessary

2

ไม่มีใครพูดถึงสิ่งต่อไปนี้ซึ่งในความเข้าใจของฉันเป็นวิธีแก้ปัญหาที่ถูกต้อง:

ไป csproj ของโครงการที่ nuget มีการติดตั้งและตั้งค่าการAutoGEneratedBindingRedirectsfalse

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

บทความฉบับเต็มใน MSDN


1

ฉันอัปเดตแพ็คเกจของฉันและติดตั้งใหม่ - แต่ฉันยังคงได้รับข้อผิดพลาดเดียวกันกับที่ OP กล่าวถึง ฉันแก้ไข dll อ้างอิงด้วยตนเองโดยทำดังต่อไปนี้

ฉันลบ newtonsoft.json.dll ออกจากข้อมูลอ้างอิงของฉันจากนั้นลบ. dll ออกจาก bin directoy ด้วยตนเอง จากนั้นฉันคัดลอก newtonsoft.json.dll ด้วยตนเองจากโฟลเดอร์แพคเกจ nuget ลงในถังโครงการจากนั้นเพิ่มการอ้างอิงโดยเรียกดูไฟล์. dll

ตอนนี้โครงการของฉันสร้างขึ้นอีกครั้ง


0

ฉันมีปัญหาที่คล้ายกันและต้องการโพสต์คำตอบสำหรับคนอื่น ๆ ในสถานการณ์ของฉัน

ฉันมีวิธีแก้ปัญหาที่เรียกใช้แอปพลิเคชันเว็บ ASP.NET กับโปรเจ็กต์ C # คลาส lib อื่น ๆ

แอปพลิเคชันเว็บ ASP.NET ของฉันไม่ได้ใช้ json แต่เป็นโครงการอื่นที่

นี่คือวิธีที่ฉันแก้ไข:

  1. ฉันตรวจสอบให้แน่ใจว่าโครงการทั้งหมดที่ใช้เวอร์ชันล่าสุด (6) โดยใช้ NuGet Update ในทุกโครงการที่ใช้ json เวอร์ชันใดก็ได้ - สิ่งนี้ไม่สามารถแก้ไขปัญหาได้
  2. ฉันเพิ่ม json ลงในเว็บแอปพลิเคชันโดยใช้ NuGet - สิ่งนี้แก้ไขปัญหาได้ (ให้ฉันดำน้ำดูว่าทำไม):

ขั้นตอนที่ 2 เป็นขั้นแรกของการเพิ่มข้อมูลการกำหนดค่าสำหรับ json ซึ่งแนะนำว่าโครงการทั้งหมดให้ใช้เวอร์ชันล่าสุด (6) ไม่ว่าจะมีเวอร์ชันใดก็ตาม การเพิ่มการรวมแอสเซมบลีเข้ากับ Web.Config น่าจะเป็นการแก้ไข

อย่างไรก็ตามขั้นตอนที่ 2 ยังล้างรหัสเดิมด้วย ปรากฎว่าก่อนหน้านี้เราเคยใช้ json เวอร์ชันเก่า (5) ในเว็บแอปพลิเคชันของเราและโฟลเดอร์ NuGet ไม่ได้ถูกลบเมื่อข้อมูลอ้างอิงถูกลบ (ฉันสงสัยว่า: ด้วยตนเอง) การเพิ่ม json ล่าสุด (6) ลบโฟลเดอร์เก่า (json v5) นี่อาจเป็นส่วนหนึ่งของการแก้ไขเช่นกัน


0

Veverke กล่าวว่าเป็นไปได้ที่จะปิดใช้งานการสร้างการเปลี่ยนเส้นทางที่มีผลผูกพันโดยการตั้งค่า AutoGEneratedBindingRedirects เป็น false ไม่แน่ใจว่าเป็นสิ่งใหม่หรือไม่ตั้งแต่โพสต์คำถามนี้ แต่มีตัวเลือก "ข้ามการใช้การเปลี่ยนเส้นทางการผูก" ใน Tools / Options / Nuget Packet Manager ซึ่งสามารถสลับได้ โดยค่าเริ่มต้นจะปิดหมายความว่าจะใช้การเปลี่ยนเส้นทาง อย่างไรก็ตามหากคุณทำเช่นนี้คุณจะต้องจัดการการเปลี่ยนเส้นทางการเชื่อมโยงที่จำเป็นด้วยตนเอง

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