คำจำกัดความรายการของชุดประกอบที่อยู่ไม่ตรงกับการอ้างอิงชุดประกอบ


751

ฉันพยายามเรียกใช้การทดสอบหน่วยในแอปพลิเคชันฟอร์ม C # Windows (Visual Studio 2005) และฉันได้รับข้อผิดพลาดต่อไปนี้:

System.IO.FileLoadException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'ยูทิลิตี้รุ่น = 1.2.0.200, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 764d581291d764f7' หรือการอ้างอิงอย่างใดอย่างหนึ่ง คำจำกัดความรายการของชุดประกอบที่อยู่ไม่ตรงกับการอ้างอิงชุดประกอบ (ข้อยกเว้นจาก HRESULT: 0x80131040) **

ที่ x.Foo.FooGO ()

ที่ x.Foo.Foo2 (String groupName_) ใน Foo.cs: บรรทัด 123

ที่ x.Foo.UnitTests.FooTests.TestFoo () ใน FooTests.cs: บรรทัด 98 **

System.IO.FileLoadException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'ยูทิลิตี้รุ่น = 1.2.0.203, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 764d581291d764f7' หรือหนึ่งในการพึ่งพาของมัน คำจำกัดความรายการของชุดประกอบที่อยู่ไม่ตรงกับการอ้างอิงชุดประกอบ (ข้อยกเว้นจาก HRESULT: 0x80131040)

ฉันดูในการอ้างอิงของฉันและฉันมีเพียงการอ้างอิงถึงUtility version 1.2.0.203(อีกอันหนึ่งเก่า)

ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันคิดออกสิ่งที่พยายามอ้างอิงไฟล์ DLL รุ่นเก่านี้?

นอกจากนี้ฉันไม่คิดว่าฉันจะมีชุดประกอบเก่านี้บนฮาร์ดไดรฟ์ของฉัน มีเครื่องมือในการค้นหาแอสเซมบลีเวอร์ชันเก่าหรือไม่


ในกรณีของฉันสิ่งนี้เกิดขึ้นเพราะฉันมีสองโครงการที่โหลด DLL เดียวกันด้วยรุ่นที่ต่างกัน (หวังว่านี่จะช่วยใครซักคน!)
miguelmpn

คำตอบ:


461

ตัวโหลด. NET Assembly:

  • ไม่พบ 1.2.0.203
  • แต่หา 1.2.0.200

แอสเซมบลีนี้ไม่ตรงกับสิ่งที่ร้องขอและดังนั้นคุณได้รับข้อผิดพลาดนี้

ด้วยคำพูดง่ายๆมันไม่สามารถหาส่วนประกอบที่อ้างอิงได้ ตรวจสอบให้แน่ใจว่าสามารถค้นหาชุดประกอบที่ถูกต้องได้โดยใส่ไว้ใน GAC หรือในเส้นทางแอปพลิเคชัน ยังเห็นhttps://docs.microsoft.com/archive/blogs/junfeng/the-located-assemblys-manifest-definition-with-name-xxx-dll-does-not-match-the-assembly-reference


19
แต่เมื่อฉันดูการอ้างอิงของโครงการมันจะชี้ไปที่ 1.2.0.203 .. ไม่มีอะไรที่ดูเหมือนจะชี้ไปที่ 1.2.0.200 อีกต่อไป
leora

128
ตรงตาม - กำลังมองหา 1.2.0.203 แต่พบ 1.2.0.200 ค้นหาว่าไฟล์นั้นอยู่ที่ไหนและแทนที่ด้วยเวอร์ชั่นที่ถูกต้อง
Jon Skeet

18
ฉันถามคำถามที่คล้ายกันที่นี่และได้วิธีแก้ปัญหาการทำงาน: stackoverflow.com/questions/4187907/ …
Michael La Voie

13
ตรวจสอบรุ่นที่ใช้อ้างอิงแล้วดูว่าเป็นรุ่นเดียวกันใน packages.config และ Web.config
zdarsky.peter

4
ข้อความนี้ทำให้ฉันสับสนทุกครั้ง ดูเหมือนว่าจะถูกเขียนย้อนหลัง ฉันคาดหวังให้บ่นเกี่ยวกับรุ่นที่คุณขอให้โหลดไม่ใช่รุ่นที่พบ ดีใจที่ฉันไม่ใช่คนเดียวที่เข้าใจผิด!
Greg Woods

91

คุณสามารถทำสองสิ่งเพื่อแก้ไขปัญหานี้ ก่อนอื่นให้ใช้การค้นหาไฟล์ Windows เพื่อค้นหาฮาร์ดไดรฟ์ของคุณเพื่อประกอบ (.dll) เมื่อคุณมีรายการผลลัพธ์ให้ดู -> เลือกรายละเอียด ... จากนั้นทำเครื่องหมายที่ "เวอร์ชันไฟล์" นี่จะแสดงหมายเลขรุ่นในรายการผลลัพธ์เพื่อให้คุณสามารถดูว่ารุ่นเก่าอาจมาจากที่ใด

เช่นเดียวกับลาร์สที่บอกว่าให้ตรวจสอบ GAC ของคุณเพื่อดูว่ามีรุ่นใดบ้างในรายการ บทความของ Microsoft นี้ระบุว่าแอสเซมบลีที่พบใน GAC ไม่ได้คัดลอกภายในเครื่องในระหว่างบิลด์ดังนั้นคุณอาจต้องลบเวอร์ชันเก่าก่อนทำการสร้างใหม่ทั้งหมด (ดูคำตอบของฉันสำหรับคำถามนี้เพื่อทราบเกี่ยวกับการสร้างไฟล์แบตช์เพื่อทำสิ่งนี้ให้คุณ)

หากคุณยังไม่สามารถทราบได้ว่าเวอร์ชั่นเก่ามาจากที่ไหนคุณสามารถใช้แอปพลิเคชั่น fuslogvw.exe ที่มาพร้อมกับ Visual Studio เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับความล้มเหลวในการรวม ไมโครซอฟท์มีข้อมูลเกี่ยวกับเครื่องมือนี้ที่นี่ โปรดทราบว่าคุณจะต้องเปิดใช้งานการบันทึกโดยการตั้งค่าHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLogรีจิสทรีคีย์เป็น 1


19
อย่าลืมว่าเวอร์ชันไฟล์ไม่ได้เป็นส่วนหนึ่งของข้อมูลประจำตัวของแอสเซมบลี แอสเซมบลีเวอร์ชันคือ แต่ไม่จำเป็นต้องเหมือนกับเวอร์ชันของไฟล์!
Lars Truijens

ถ้าใช้ fuslogvw สำหรับบริการอ่านบล๊อ
คส์ม

การค้นหาชื่อไฟล์แก้ปัญหาของฉันได้ ฉันมี dll รุ่นเก่าในโฟลเดอร์ Temporary ASP.Net ของฉันและ InstallShield ใช้มันแทนที่จะเป็นรุ่นล่าสุด! วิธีแก้ปัญหาใหม่สร้างใหม่รีสตาร์ท PC ไม่ทำอะไรเลย ทำงานได้ดีในพื้นที่และพัดทุกครั้งที่มีการใช้งาน
JumpingJezza

ทันทีที่สร้างเว็บไซต์ของฉันก็ใช้งานได้ดี แต่อีกไม่นานปัญหานี้ก็ลดลง
Shavais

ฉันแก้ไขคำตอบนี้เพื่อบอกว่าเป็นเวอร์ชั่นแอสเซมบลีแทน
7

60

ฉันพบปัญหานี้ด้วยตัวเองและฉันพบว่าปัญหานั้นแตกต่างจากที่คนอื่นพบ

ฉันมี DLLs สองตัวที่โครงการหลักของฉันอ้างอิง: CompanyClasses.dll และ CompanyControls.dll ฉันได้รับข้อผิดพลาดรันไทม์ว่า:

ไม่สามารถโหลดไฟล์หรือชุดประกอบ 'CompanyClasses, เวอร์ชัน = 1.4.1.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 045746ba8544160c' หรือการอ้างอิงอย่างใดอย่างหนึ่ง คำจำกัดความรายการของชุดประกอบที่อยู่ไม่ตรงกับการอ้างอิงชุดประกอบ

ปัญหาคือฉันไม่มีไฟล์ CompanyClasses.dll ในระบบของฉันด้วยหมายเลขรุ่น 1.4.1 ไม่มีใน GAC ไม่มีในโฟลเดอร์แอพ ... ไม่มีเลย ฉันค้นหาฮาร์ดไดรฟ์ทั้งหมดของฉัน ไฟล์ CompanyClasses.dll ทั้งหมดที่ฉันมีคือ 1.4.2

ปัญหาที่แท้จริงฉันพบว่าเป็น CompanyControls.dll รุ่น 1.4.1 อ้างอิงของ CompanyClasses.dll ฉันเพิ่งคอมไพล์ CompanyControls.dll อีกครั้ง (หลังจากให้มันอ้างอิง CompanyClasses.dll 1.4.2) และข้อผิดพลาดนี้ก็หายไปสำหรับฉัน


2
+1 มีบางอย่างที่คล้ายกันเกิดขึ้นกับฉันเมื่อฉันมีหนึ่งใน DLLs ของฉันอ้างอิง Caliburn Micro รุ่นเก่ากว่า
Jason Massey

ฉันด้วยประสบการณ์ของคุณจุดประกายฉันที่ฉันต้องการดูและฉันได้รับการแก้ไขปัญหาของฉัน
Esen

ตัวเลือกอื่นจะเปิดCompanyControlsโครงการคลิกขวาที่การCompanyClasses.dllอ้างอิง -> คุณสมบัติ ->SpecificVersion = false
BlueRaja - Danny Pflughoeft

กรณีนี้มักเกิดขึ้นกับแอปพลิเคชัน xamarin ฉันมีโครงการ xamarin.forms แตกต่างจากโครงการ xamarin.droid ฉันเพิ่งเห็นโพสต์ของคุณและฉันจำได้
batmaci

หาก CompanyClasses.dll ลงชื่อแล้วSpecificVersion = falseคนเดียวจะไม่ถูกตัดออก bindingredirectคุณจะต้องมี
เดนิส Skidmore

53

ข้อมูลต่อไปนี้จะเปลี่ยนเส้นทางชุดประกอบไปเป็นรุ่น 3.1.0.0 เรามีสคริปต์ที่จะอัปเดตข้อมูลอ้างอิงนี้เสมอใน App.config ดังนั้นเราจึงไม่ต้องจัดการกับปัญหานี้อีก

คุณจะได้แอสเซมบลี publicKeyToken และสร้างบล็อกนี้จากไฟล์. dll เอง

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
    <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="3.1.0.0" />
  </dependentAssembly>
</assemblyBinding>

โปรดทราบว่าไม่มีแอตทริบิวต์ XML namespace (xmlns) สิ่งนี้จะไม่ทำงาน


1
สิ่งนี้ใช้ได้สำหรับฉัน ฉันเปลี่ยน 'newVersion = 3.3.3' เป็น 'newVersion = 3.1.0'
jward01

ที่ดีที่สุดที่จะไม่ลงไปตามเส้นทาง rebinding ถ้าคุณสามารถหลีกเลี่ยงได้ เมื่อบั๊กนั้นมากัดคุณมันจะกัดยาก
BanksySan

1
ปัญหาของฉันคือความจริงที่ว่าการเปลี่ยนเส้นทางชี้ไปที่แอสเซมบลีที่ไม่มีอยู่จริง App.Config เก็บข้อมูลการชุมนุมจากแพ็คเกจ NuGet ล่าสุดที่ฉันติดตั้ง เมื่อฉันลดระดับแพ็คเกจเหล่านี้ในภายหลังมันไม่ได้ล้างสิ่งนี้ นี่คือไลบรารีคลาส. NET มาตรฐานที่ถูกเข้าชมโดยโครงการทดสอบหน่วยกรอบ 4.7.2 ปัญหาของโครงการทดสอบหน่วยนำเสนอที่รันไทม์ ..
D-Sect

@ D-Sect ถูกต้อง หากการควบคุมแหล่งที่มาของคุณบ่งชี้ว่า web.config มีการเปลี่ยนแปลง (เพราะคุณได้เล่นกับ NuGets ของคุณ) คุณอาจจะฉลาดในการสำรองการเชื่อมโยงเหล่านั้นออกจากที่นั่น การลดระดับ NuGets จะไม่ทำความสะอาดการเปลี่ยนเส้นทางที่มีผลผูกพัน
bkwdesign

45

หากคุณกำลังใช้ Visual Studio ให้ลอง "ล้างโซลูชัน" แล้วสร้างโครงการของคุณใหม่


14
นี่เป็นวิธีแก้ปัญหาสำหรับฉัน บ่อยครั้งที่การลบbinและobjทำมัน โดยพื้นฐานแล้วบางสิ่งที่ฉันเคยอ้างอิงยังคงนั่งอยู่ที่นั่นเพื่อพยายามสนองความต้องการเดียวกัน ตัวอย่างเช่นเวอร์ชันเก่าเป็นสิ่งที่ฉันอ้างอิงโดยตรงและเวอร์ชันใหม่เป็นของ NuGet
David Betz

พบปัญหานี้สำหรับ DLLs หลายตัวหลังจากการดึงจาก TFS วิธีนี้แก้ไขได้สำหรับฉัน
Milo

3
ทำงานให้ฉัน ลบโฟลเดอร์ bin amd obj และแก้ไขปัญหาแล้ว
user1619480

ขอบคุณทำงานให้ฉันด้วยเพียงแค่ลบโฟลเดอร์ bin
สุนัขคุกกี้

สำหรับฉันมันก็เพียงพอที่จะลบbinโฟลเดอร์ น่าแปลกที่ฉันลองใช้โซลูชันที่สะอาดและสร้างโซลูชันใหม่ก่อนที่จะไม่ประสบความสำเร็จ บางครั้งก็แปลกไปหน่อย
Lion

36

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


8
การตั้งค่าดังกล่าวมีผลเฉพาะเวลารวบรวมเท่านั้น หลังจากคอมไพล์แล้วมันจะต้องมีเวอร์ชั่นแอสเซมบลีที่แน่นอนซึ่งคุณรวบรวมไว้ ดูstackoverflow.com/questions/24022134/…
Lars Truijens

22

ฉันเพิ่งพบปัญหานี้และปัญหาคือฉันมีสำเนา. dll ในไดเรกทอรีการดีบักแอปพลิเคชันของฉันเก่า คุณอาจต้องการตรวจสอบที่นั่น (แทน GAC) เพื่อดูว่าคุณเห็นหรือไม่


เราเพิ่งย้ายไปยังเซิร์ฟเวอร์อื่นมีปัญหานี้ทำให้เราสำรองข้อมูล ทำงานหลังจากลบสำเนาสำรอง ขอบคุณ :)
Jtuck

22

ฉันกำลังจะระเบิดความคิดของทุกคนในตอนนี้ . .

ลบการ<assemblyBinding>อ้างอิงทั้งหมดออกจากไฟล์. config ของคุณแล้วเรียกใช้คำสั่งนี้จากคอนโซล NuGet Package Manager:

Get-Project -All | Add-BindingRedirect

ทำงานให้ฉันเช่นกัน ขอบคุณ
Oleh Udovytskyi

คุณประหยัดเวลาของฉัน👌👌
Abdu Imam

4
สิ่งนี้ใช้ได้เฉพาะเมื่อรูปแบบการจัดการแพ็กเกจคือ packages.config หากคุณใช้ 2017 csproj โดยไม่ต้องใช้ package.config มันไม่ทำงาน :(
ManiVI

1
ใจเป่าอย่างเป็นทางการ
BGilman

นั่นเป็นเคล็ดลับเล็ก ๆ ที่ดี
hexagod

21

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

ฉันลบแพ็กเกจและอ้างอิงไฟล์ DLL แบบคงที่รุ่นเก่ากว่า แต่ไฟล์ web.config ไม่เคยอัปเดตจาก:

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

เป็นสิ่งที่ควรเปลี่ยนกลับเป็นเมื่อฉันถอนการติดตั้งแพคเกจ:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>

ฉันได้เห็นสิ่งนี้อย่างน้อยที่สุดสำหรับโมดูล Entity Framework เมื่อคุณใช้ NuGet หากคุณคลิกขวาที่โซลูชันของคุณไปที่จัดการแพ็กเกจ NuGet สำหรับโซลูชันจากนั้นเลือกแพ็คเกจที่ติดตั้ง> ทั้งหมดเลือกโมดูลนั้นเลือกจัดการคุณสามารถ มักจะยกเลิกการเลือกจากโครงการของคุณ นั่นควรล้างสิ่งต่างๆเช่นนี้โดยไม่ต้องทำเอง - โดยสมมติว่าผู้ขายทำการตรวจสอบอย่างละเอียด แต่การจับที่ดีอย่างชัดเจนบางครั้งพวกเขาทำไม่ได้ถ้านั่นเป็นวิธีที่คุณลบ
vapcguy

20

ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นขณะเรียกใช้โปรแกรมประยุกต์ ASP.NET ทางออกคือ:

  1. ลบobjและbinโฟลเดอร์ในโฟลเดอร์โครงการ

สะอาดไม่ทำงานการสร้างใหม่ไม่ทำงานการอ้างอิงทั้งหมดใช้ได้ แต่มันไม่ได้เขียนหนึ่งในห้องสมุด หลังจากลบไดเรกทอรีเหล่านั้นทุกอย่างทำงานได้อย่างสมบูรณ์


3
ขอบคุณ Levi Fuller คำตอบนี้ควรสูงกว่านี้ สำหรับสถานการณ์ของฉันมันเป็นจุดบน! สำหรับฉันข้อผิดพลาดนี้เริ่มต้นเมื่อฉันทำสำเนาสำรองของ web.config ของฉันและ Visual Studio ยังคงโหลดไฟล์กำหนดค่านี้แทนการกำหนดค่าจริงแม้หลังจากที่ฉันลบสำเนาที่ซ้ำกัน สิ่งนี้แก้ไขได้ ขอบคุณ
BruceHill

ทำงานให้ฉันด้วย ยังไม่แน่ใจว่าทำไมจึงใช้งานได้ :(
KangarooWest

14

ในกรณีของฉันมันเป็น DLL รุ่นเก่าใน C: \ WINDOWS \ Microsoft.NET \ Framework \ ~ \ Temporary ASP.NET Files \ ไดเรกทอรี คุณสามารถลบหรือแทนที่เวอร์ชันเก่าหรือคุณสามารถลบและเพิ่มการอ้างอิงกลับไปยัง DLL ในโครงการของคุณ โดยพื้นฐานแล้วทั้งสองวิธีจะสร้างตัวชี้ใหม่ไปยังไฟล์ ASP.NET ชั่วคราว


2
สิ่งนี้ใช้ได้สำหรับฉันเมื่อฉันปิด Visual Studio หยุด IIS และลบไฟล์ ASP.NET ชั่วคราวทั้งหมด หมายเหตุอาจมีไฟล์ในโฟลเดอร์ Framework และ Framework64 หากบนเครื่อง 64 บิตเช่นเดียวกับในโฟลเดอร์. NET 2.0 และ 4.0!
ไบรอัน B

ฉันใช้ฟังก์ชั่นการค้นหาเมนูเริ่มของ Windows เพื่อค้นหา DLLs ทั้งหมดที่สร้างโดยโซลูชันของฉันแล้วลบล็อตทั้งหมดไม่ว่าจะพบที่ไหน ฉันสามารถทำได้โดยไม่ต้องกลัวเพราะควรสร้างในระหว่างการดีบัก Visual Studio ของฉันเท่านั้น เนื่องจาก VS จะสร้าง DLLs ที่หายไปและไม่มีสิ่งใดที่อยู่นอกโซลูชันของฉันที่ควรอ้างอิงถึงนี่คือการดำเนินการ "ปลอดภัย" สำหรับฉัน
Zarepheth

8

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

ส่วนที่น่ารำคาญก็คือข้อความแสดงข้อผิดพลาดไม่ได้บ่งบอกถึงการอ้างอิงที่ก่อให้เกิดปัญหา


2
ในกรณีของฉันหลังจากอัปเกรดเป็นรุ่น DevExpress ใหม่ไฟล์. resx ของแบบฟอร์มจะมีการอ้างอิงถึงเวอร์ชันไลบรารีที่ถอนการติดตั้งเก่า ฉันต้องเปิด. resx ในมุมมองโค้ดและแก้ไขเวอร์ชันเป็นเวอร์ชันใหม่หรือลบรายการที่ไม่ถูกต้อง
Artemix

5

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

คุณต้องเพิ่มโทเค็นกุญแจสาธารณะที่ถูกต้อง (คุณสามารถรับได้โดยใช้ sn -T บน dll) เพื่อแก้ไขข้อผิดพลาด หวังว่านี่จะช่วยได้


1
กรุณาอธิบายอย่างละเอียด - "sn -T" คืออะไร? และฉันจะเพิ่มโทเค็นกุญแจสาธารณะได้ที่ไหน
Moritz ทั้ง

3
"sn.exe" เป็นเครื่องมือที่มาพร้อมกับ Visual Studio เป็นเครื่องมือบรรทัดคำสั่งที่สามารถเรียกใช้จากพรอมต์คำสั่ง Visual Studio เพียงเรียกใช้พรอมต์คำสั่ง Visual Studio (จากเมนูเริ่ม) นำทางไปยังโฟลเดอร์ที่มีชุดประกอบของคุณและพิมพ์ "sn -T <assembly>" โดยที่ <assembly> เป็นชื่อเต็มของ dll สิ่งนี้จะได้รับข้อมูลประกอบ "โทเค็น" เมื่อคุณมีสิ่งนี้เมื่อคุณทำผูกพันผูกพันกับการสะท้อนให้ป้อนข้อมูลโทเค็นลงในสตริง id ประกอบ (เช่น "Assembly = MyAssembly.dll โทเค็นคีย์สาธารณะ = <token guid>)
Guy Starbuck

2
ขอบคุณสำหรับคำตอบนี้ ฉันได้รับข้อผิดพลาดนี้เมื่ออ้างถึงส่วนกำหนดค่าใน App.ini ของฉัน ฉันเพิ่งได้ลงนามในการชุมนุมดังนั้น PublicKeyToken = null จะต้องมีการปรับปรุงด้วยโทเค็นใหม่ (ถูกต้อง)
เลียม

5

ฉันเป็นสถานการณ์ที่คล้ายกันมากกับโพสต์โดย Nathan Bedford แต่มีการบิดเล็กน้อย โครงการของฉันอ้างถึง dll ที่ถูกเปลี่ยนแปลงด้วยสองวิธี 1) โดยตรงและ 2) ทางอ้อมโดยอ้างอิงองค์ประกอบ (ไลบรารีคลาส) ที่ตัวเองมีการอ้างอิงถึง dll ที่เปลี่ยนแปลง ตอนนี้โครงการ Visual Studio ของฉันสำหรับองค์ประกอบ (2) อ้างอิงรุ่นที่ถูกต้องของ dll ที่เปลี่ยนแปลง อย่างไรก็ตามหมายเลขเวอร์ชั่นของคอมเพล็นท์เองนั้นไม่เปลี่ยนแปลง และเป็นผลให้การติดตั้งเวอร์ชันใหม่ของโครงการล้มเหลวในการแทนที่ส่วนประกอบนั้นบนเครื่องไคลเอ็นต์

ผลลัพธ์สุดท้าย: การอ้างอิงโดยตรง (1) และการอ้างอิงทางอ้อม (2) ชี้ไปที่ dll รุ่นที่เปลี่ยนแปลงที่เครื่องลูกค้า บนเครื่อง dev ของฉันมันใช้งานได้ดี

การแก้ไข: ลบแอปพลิเคชัน ลบ DLLS ทั้งหมดออกจากโฟลเดอร์แอปพลิเคชัน ติดตั้งใหม่เรียบง่ายเหมือนในกรณีของฉัน


4

ฉันจะให้ใครบางคนได้รับประโยชน์จากความเขลาเฉือนของฉัน ฉันมีบางสิ่งที่ต้องพึ่งพาแอปพลิเคชันที่แยกจากกันโดยสิ้นเชิง (เรียกว่า App1 นี้) dll จาก App1 นั้นถูกดึงเข้าไปในแอปพลิเคชันใหม่ของฉัน (App2) เมื่อใดก็ตามที่ฉันอัปเดตใน APP1 ฉันต้องสร้าง dll ใหม่และคัดลอกลงใน App2 ดี. . . ฉันเบื่อที่จะทำสำเนาและวางระหว่าง App1 รุ่นที่แตกต่างกัน 2 รุ่นดังนั้นฉันก็เพิ่มคำนำหน้า 'NEW_' ลงใน dll

ดี. . . ฉันเดาว่ากระบวนการสร้างสแกนโฟลเดอร์ / bin และเมื่อมันจับคู่บางอย่างไม่ถูกต้องมัน barfs กับข้อความข้อผิดพลาดเช่นเดียวกับที่ระบุไว้ข้างต้น ฉันลบเวอร์ชัน "new_" ของฉันแล้วและก็สร้างขึ้นมาใหม่


4

ปัญหาของฉันคือการคัดลอกซอร์สโค้ดไปยังเครื่องใหม่โดยไม่ต้องดึงชุดประกอบที่อ้างถึง

ไม่มีอะไรที่ฉันได้แก้ไขข้อผิดพลาดดังนั้นในรีบฉันลบไดเรกทอรี BIN ทั้งหมด สร้างซอร์สโค้ดของฉันอีกครั้งและมันก็ใช้ได้ตั้งแต่นั้นมา


4

ฉันต้องการเพิ่มว่าฉันกำลังสร้างโครงการ ASP.NET MVC 4 ขั้นพื้นฐานและเพิ่ม DotNetOpenAuth.AspNet ผ่าน NuGet สิ่งนี้ส่งผลให้เกิดข้อผิดพลาดเดียวกันหลังจากที่ฉันอ้างอิงไฟล์ DLL ที่ไม่ตรงกันสำหรับ Microsoft.Web.WebPages.OAuth

เมื่อต้องการแก้ไขฉันทำUpdate-Packageและทำความสะอาดโซลูชันสำหรับการสร้างใหม่ทั้งหมด

ที่ได้ผลสำหรับฉันและเป็นวิธีที่ขี้เกียจ แต่เวลาคือเงิน :-P


1
คำตอบที่คล้ายกันสำหรับฉัน Update-Package -reinstallติดตั้งแพ็กเกจ NuGet ทั้งหมดอีกครั้งในเวอร์ชันเดียวกัน
Jess

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

4

ฉันได้รับข้อผิดพลาดนี้ในขณะสร้างบนบริการสร้างของ Team Foundation Server มันกลับกลายเป็นว่าฉันมีหลายโครงการในโซลูชันของฉันโดยใช้ไลบรารีเดียวกันที่เพิ่มเข้ามากับ NuGet รุ่นต่างๆ ฉันลบรุ่นเก่าทั้งหมดด้วย NuGet และเพิ่มใหม่เป็นข้อมูลอ้างอิงสำหรับทุกคน

Team Foundation Server เก็บไฟล์ DLL ทั้งหมดไว้ในไดเรกทอรีเดียวและสามารถมีไฟล์ DLL ได้เพียงชื่อเดียวเท่านั้นในแต่ละครั้ง


อีกวิธีหนึ่งคือคลิก "จัดการแพคเกจ NuGet สำหรับวิธีแก้ปัญหา ... " และอัปเดตทั้งโครงการทดสอบของคุณและโครงการภายใต้การทดสอบเป็นเวอร์ชัน (ใหม่ที่สุด) เดียวกัน
lixonn

4

แอพของฉัน. config ประกอบด้วย

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>

สำหรับ npgsql อย่างใดในเครื่องของผู้ใช้ app.exe.config ของฉันก็หายไป ฉันไม่แน่ใจว่าเป็นผู้ใช้ที่โง่เขลาติดตั้งผิดพลาดหรือกำจัดไวรัส การแทนที่ไฟล์ช่วยแก้ไขปัญหาได้


3

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

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


3

สำหรับฉันการกำหนดค่าความครอบคลุมรหัสในไฟล์ "Local.testtesttings" ทำให้เกิดปัญหา " ฉันลืมอัปเดตไฟล์ที่อ้างถึงที่นั่น


3

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


1
คุณรู้อะไรคุณช่วยฉันออกจากความทุกข์ยากของฉันขอบคุณแน่นอน
Ronny Mahlangu

2

ทำความสะอาดและสร้างโซลูชันขึ้นใหม่อาจไม่สามารถแทนที่ dll ทั้งหมดจากไดเรกทอรีผลลัพธ์

สิ่งที่ฉันจะแนะนำคือลองเปลี่ยนชื่อโฟลเดอร์จาก "bin" เป็น "oldbin" หรือ "obj" เป็น "oldobj"

จากนั้นลองสร้างความเงียบของคุณอีกครั้ง

กรณีถ้าคุณใช้ dll ของบุคคลที่สามคุณจะต้องคัดลอกไปยังโฟลเดอร์ "bin" หรือ "obj" ที่สร้างขึ้นใหม่หลังจากสร้างสำเร็จ

หวังว่าสิ่งนี้จะได้ผลสำหรับคุณ


1

การลบแอสเซมบลีเก่าด้วยตนเองจากตำแหน่งโฟลเดอร์แล้วเพิ่มการอ้างอิงไปยังแอสเซมบลีใหม่อาจช่วย


1

ฉันได้รับข้อผิดพลาดเดียวกัน ... ในกรณีของฉันมันได้รับการแก้ไขดังนี้:

  • ในตอนแรกเมื่อติดตั้งแอปพลิเคชันแล้วบุคคลที่นี่เคยใช้ Microsoft Enterprise Library 4.1 ในแอปพลิเคชัน
  • ในสัปดาห์ก่อนหน้าเครื่องของฉันถูกฟอร์แมตและหลังจากวันนี้เมื่อฉันสร้างแอปพลิเคชันนั้นมันทำให้ฉันมีข้อผิดพลาดว่าการประกอบ Enterprise Library หายไป
  • จากนั้นฉันติดตั้ง Microsoft Enterprise Library 5.0 ซึ่งฉันได้รับจาก Google เป็นรายการค้นหาครั้งแรก
  • จากนั้นเมื่อฉันสร้างแอปพลิเคชันมันทำให้ฉันมีข้อผิดพลาดดังกล่าวข้างต้นคือคำจำกัดความของรายการประกอบที่อยู่ไม่ตรงกับการอ้างอิงประกอบ
  • หลังจากการค้นหาและวิเคราะห์งานส่วนใหญ่ฉันพบว่าแอปพลิเคชันอ้างอิง 4.1.0.0 & DLL ในโฟลเดอร์ช่องเก็บเป็นเวอร์ชัน 5.0.0.0
  • สิ่งที่ฉันทำตอนนั้นคือฉันติดตั้ง Microsoft Enterprise Library 4.1
  • ลบการอ้างอิงก่อนหน้า (5.0) & เพิ่มการอ้างอิง 4.0
  • สร้างแอปพลิเคชัน & voila ... ใช้งานได้

1

นี่คือวิธีของฉันในการแก้ไขปัญหานี้

  1. จากข้อความข้อยกเว้นรับชื่อของไลบรารี "ปัญหา" และหมายเลขเวอร์ชัน "ที่คาดหวัง"

ป้อนคำอธิบายรูปภาพที่นี่

  1. ค้นหาสำเนาทั้งหมดของ. dll นั้นในโซลูชันของคุณคลิกขวาที่ไฟล์เหล่านั้นและตรวจสอบว่าเป็นไฟล์. dll เวอร์ชันใด

ป้อนคำอธิบายรูปภาพที่นี่

ตกลงดังนั้นในตัวอย่างนี้. dll ของฉันคือ 2.0.5022.0 แน่นอน (ดังนั้นหมายเลขรุ่นข้อยกเว้นจะไม่ถูกต้อง)

  1. ค้นหาหมายเลขรุ่นที่แสดงในข้อความข้อยกเว้นในไฟล์. csprojทั้งหมดในโซลูชันของคุณ แทนที่หมายเลขรุ่นนี้ด้วยหมายเลขจริงจาก dll

ดังนั้นในตัวอย่างนี้ฉันจะแทนที่ ...

<Reference Include="DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

... ด้วยสิ่งนี้...

<Reference Include="DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

งานเสร็จแล้ว!


จะทำอย่างไรถ้าไฟล์ csproj ของฉันไม่มีรุ่นที่อ้างอิง
John Demetriou

1

ในกรณีของฉันปัญหาอยู่ระหว่างเก้าอี้กับคีย์บอร์ด :-)

Could not load file or assembly 'DotNetOpenAuth.Core, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=2780ccd10d57b246' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)

แอสเซมบลีที่แตกต่างกันอย่างน้อยสองอย่างต้องการใช้ไลบรารี DotNetOpenAuth รุ่นอื่นและนั่นจะไม่เป็นปัญหา นอกจากนี้บนคอมพิวเตอร์ในพื้นที่ของฉัน web.config ได้รับการปรับปรุงโดยอัตโนมัติโดย NuGet:

<dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
    </dependentAssembly>
    <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>

จากนั้นฉันก็รู้ว่าฉันลืมที่จะคัดลอก / ปรับใช้ web.config ใหม่ไปยังเซิร์ฟเวอร์ที่ใช้งานจริง ดังนั้นหากคุณมีวิธีการปรับใช้ web.config แบบแมนนวลให้ตรวจสอบว่าได้รับการอัพเดต หากคุณมี web.config ที่แตกต่างกันโดยสิ้นเชิงสำหรับเซิร์ฟเวอร์ที่ใช้งานจริงคุณจะต้องรวมส่วน dependentAssembly เหล่านี้ในการซิงค์หลังจากใช้ NuGet


1

หากคุณเคยได้รับข้อผิดพลาดเช่น " คำจำกัดความที่ชัดเจนของแอสเซมบลีที่ตั้งอยู่ไม่ตรงกับการอ้างอิงแอสเซมบลี " และหากคุณอัปเดตผ่านทางโครงการ> จัดการแพคเกจ NuGet และแท็บอัปเดตใน VSสิ่งแรกที่คุณทำได้คือลองติดตั้ง แพคเกจหลังจากตรวจสอบเวอร์ชั่นจากหน้า NuGet Galleryและรันคำสั่ง folowing จาก Package Manager Console:

PM> Install-Package YourPackageName -Version YourVersionNumber 
//Example
PM> Install-Package Microsoft.Extensions.FileProviders.Physical -Version 2.1.0

แม้ว่าคำตอบจะไม่เกี่ยวข้องโดยตรงกับแพคเกจที่มีปัญหาและมันถูกถามทางกลับมันเป็นประเภททั่วไปยังคงเกี่ยวข้องและหวังว่าจะช่วยใครบางคน


1

ไม่มีวิธีแก้ปัญหาสำหรับฉัน ฉันลองโซลูชันโปรเจ็กต์ใหม่ทั้งหมดลบ bin อัปเดตแพคเกจดาวน์เกรดแพคเกจและอื่น ๆ ... หลังจากสองชั่วโมงฉันโหลด App.config เริ่มต้นจากโครงการที่มีชุดประกอบและฉันเปลี่ยนรุ่นอ้างอิงผิดจาก:

<dependentAssembly>
    <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
</dependentAssembly>

ถึง:

<dependentAssembly>
    <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.14.0.0" newVersion="5.5.0.0" />
</dependentAssembly>

หลังจากนี้ฉันทำความสะอาดโครงการสร้างใหม่อีกครั้งและใช้งานได้ ไม่มีการเตือนไม่มีปัญหา


0

ฉันได้รับข้อความแสดงข้อผิดพลาดนี้เนื่องจากการอ้างอิงแอสเซมบลีที่มีชื่อเดียวกันกับแอสเซมบลีที่ฉันกำลังสร้าง

การคอมไพล์นี้ แต่เขียนทับแอสเซมบลีที่อ้างอิงกับแอสเซมบลีโครงการปัจจุบัน - จึงทำให้เกิดข้อผิดพลาด

เมื่อต้องการแก้ไขฉันเปลี่ยนชื่อของโครงการและคุณสมบัติแอสเซมบลีที่พร้อมใช้งานผ่านการคลิกขวาที่โครงการและเลือก 'คุณสมบัติ'

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