ฉันได้เพิ่มแอสเซมบลีที่ชื่ออย่างอ่อนในโครงการVisual Studio 2005ของฉัน(ซึ่งมีชื่อขอ) ตอนนี้ฉันได้รับข้อผิดพลาด:
"แอสเซมบลีที่อ้างอิง 'xxxxxxxx' ไม่มีชื่อที่รัดกุม"
ฉันจำเป็นต้องเซ็นชื่อชุดประกอบบุคคลที่สามนี้หรือไม่
ฉันได้เพิ่มแอสเซมบลีที่ชื่ออย่างอ่อนในโครงการVisual Studio 2005ของฉัน(ซึ่งมีชื่อขอ) ตอนนี้ฉันได้รับข้อผิดพลาด:
"แอสเซมบลีที่อ้างอิง 'xxxxxxxx' ไม่มีชื่อที่รัดกุม"
ฉันจำเป็นต้องเซ็นชื่อชุดประกอบบุคคลที่สามนี้หรือไม่
คำตอบ:
เพื่อหลีกเลี่ยงข้อผิดพลาดนี้คุณสามารถ:
คุณจะพบคำแนะนำเกี่ยวกับการลงนามแอสเซมบลีของบุคคลที่สามใน. NET-fu: การลงนามในแอสเซมบลี Unsigned (โดยไม่ต้องเซ็นชื่อล่าช้า)(โดยไม่ชักช้าลงนาม)
หลักการพื้นฐานในการลงชื่อบุคคลที่สามคือ
ถอดชุดประกอบโดยใช้ildasm.exe
และบันทึกภาษากลาง (IL):
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
สร้างและเซ็นชื่อชุดประกอบใหม่:
ilasm /dll /key=myKey.snk thirdPartyLib.il
ขั้นตอนข้างต้นทำงานได้ดีเว้นแต่แอสเซมบลีบุคคลที่สาม ( A.dll ) ของคุณอ้างอิงถึงไลบรารีอื่น ( B.dll ) ซึ่งจะต้องมีการเซ็นชื่อด้วย คุณสามารถแยกชิ้นส่วนสร้างใหม่และลงนามทั้งA.dllและB.dllโดยใช้คำสั่งด้านบน แต่ในขณะรันไทม์การโหลดB.dllจะล้มเหลวเพราะA.dllถูกสร้างขึ้นครั้งแรกโดยมีการอ้างอิงถึงB.dllรุ่นที่ไม่ได้ลงนาม B.dll
การแก้ไขปัญหานี้คือการแก้ไขไฟล์ IL ที่สร้างในขั้นตอนที่ 1 ด้านบน คุณจะต้องเพิ่มโทเค็นกุญแจสาธารณะของ B.dll เพื่อการอ้างอิง คุณได้รับโทเค็นนี้ด้วยการโทร
sn -Tp B.dll
ซึ่งจะให้ผลลัพธ์ต่อไปนี้:
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.33440
Copyright (c) Microsoft Corporation. All rights reserved.
Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92
Public key token is a8a7ed7203d87bc9
บรรทัดสุดท้ายมีโทเค็นกุญแจสาธารณะ จากนั้นคุณต้องค้นหา IL ของA.dllสำหรับการอ้างอิงถึงB.dllและเพิ่มโทเค็นดังนี้:
.assembly extern /*23000003*/ MyAssemblyName
{
.publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )
.ver 10:0:0:0
}
ขยายไฟล์โครงการที่ใช้โครงการที่ไม่มี "มีชื่อที่รัดกุม" และค้นหา.snk
ไฟล์ (.StrongNameKey)
เรียกดูไฟล์นี้ในWindows Explorer (เพื่อให้คุณทราบว่าอยู่ที่ไหน)
ย้อนกลับไปที่ Visual Studio ในโครงการที่ไม่มี "มีชื่อที่รัดกุม"
<Browse>
ไปยัง.snk
ไฟล์ที่คุณพบก่อนหน้านี้นั่นควรทำเคล็ดลับ สิ่งนี้แก้ปัญหาสำหรับฉันสำหรับโครงการหนึ่งโดยใช้แบบฟอร์มภายในโครงการอื่นในโซลูชันเดียวกัน
ฉันหวังว่ามันจะช่วย
ฉันค้นหาวิธีแก้ไขปัญหาเดียวกันและยกเลิกตัวเลือก "ลงชื่อการชุมนุม" ไม่ทำงานสำหรับฉัน:
(ตามที่คุณอาจสังเกตเห็นภาพหน้าจอมาจาก VS2010 แต่หวังว่ามันจะช่วยให้ใครบางคน)
ฉันได้เขียนเครื่องมือเพื่อประกอบชุดเครื่องหมายที่มีชื่ออย่างรัดกุมโดยอัตโนมัติรวมถึงที่คุณไม่มีซอร์สโค้ดหรือโครงการที่ถูกทอดทิ้ง มันใช้เทคนิคหลายอย่างที่อธิบายไว้ในคำตอบในวิธีที่ง่ายโดยไม่มีข้อบกพร่องหรือข้อบกพร่องของเครื่องมือที่มีอยู่หรือคำแนะนำวันที่
http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer
หวังว่านี่จะช่วยให้ทุกคนที่ต้องลงนามในการชุมนุมของบุคคลที่สามโดยไม่ต้องกระโดดผ่านห่วงเพื่อไปที่นั่น
คุณสามารถใช้ชุดประกอบที่ไม่ได้ลงชื่อถ้าชุดประกอบของคุณยังไม่ได้ลงนาม
การลงนามในการชุมนุมของบุคคลที่สามได้ผลสำหรับฉัน:
http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name
แก้ไข : ฉันได้เรียนรู้ว่ามีประโยชน์ในการโพสต์ขั้นตอนในกรณีที่บทความที่เชื่อมโยงไม่ถูกต้องอีกต่อไป เครดิตทั้งหมดไปที่Hiren Khirsaria :
เรียกใช้พรอมต์คำสั่ง visual studio และไปที่ไดเรกทอรีที่ DLL ของคุณอยู่
For Example my DLL is located in
D:/hiren/Test.dll
ตอนนี้สร้างไฟล์ IL โดยใช้คำสั่งด้านล่าง
D:/hiren> ildasm /all /out=Test.il Test.dll
(คำสั่งนี้สร้างไลบรารีรหัส)
สร้างคีย์ใหม่เพื่อเซ็นชื่อโครงการของคุณ
D:/hiren> sn -k mykey.snk
ตอนนี้ลงชื่อไลบรารีของคุณโดยใช้ilasm
คำสั่ง
D:/hiren> ilasm /dll /key=mykey.snk Test.il
sn
ildasm
และilasm
sn –k Cool.Library.snk
เพื่อสร้างคู่คีย์ใหม่ildasm Cool.Library.dll /out:Cool.Library.il
เพื่อแยกไลบรารีmove Cool.Library.dll Cool.Library.unsigned.dll
เพื่อให้ไลบรารีดั้งเดิมเป็นแบ็คอัพilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
เพื่อรวมไลบรารีใหม่ด้วยชื่อที่รัดกุมpowershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
เพื่อรับชื่อที่ผ่านการรับรองโดยสมบูรณ์ คุณจะต้องใช้บิตนี้หากคุณต้องอ้างอิง DLL ในไฟล์กำหนดค่าภายนอกเช่น web.config หรือ app.configผมมีปัญหานี้สำหรับแอปที่ได้รับการขอชื่อแล้วก็ต้องเปลี่ยนมันเพื่อที่จะอ้างอิงหนึ่งที่ไม่ได้ขอชื่อชุมนุมดังนั้นผมจึงไม่ได้ตรวจสอบ 'เข้าสู่ระบบการชุมนุมในคุณสมบัติของโครงการส่วนการลงนาม แต่มันก็ยังคงบ่น ฉันคิดว่ามันต้องเป็นสิ่งประดิษฐ์ที่ทำให้เกิดปัญหาเพราะฉันทำทุกอย่างถูกต้องและมันก็เป็นเช่นนั้น ฉันพบและลบบรรทัด: [assembly: AssemblyKeyFile ("yourkeyfilename.snk")]] จากไฟล์ assemblyInfo.cs จากนั้นไม่มีการสร้างคำร้องเรียนหลังจากนั้น
สำหรับฉันปัญหาของฉันคือฉันมีแพคเกจ NuGet เดียวกันสองรุ่นที่ติดตั้งพร้อมกับรุ่นที่แตกต่างกัน
การลบเครื่องหมายถูก"ลงนามในชุดประกอบ"ภายใต้แท็บ"การลงนาม"ทำงานเป็น @Michal Stefanow กล่าว
เพิ่มที่นี่เป็นวิธีที่ง่ายที่สุดในการลงชื่อไฟล์ของคุณเองและ / หรือไฟล์ของคนอื่น คุณเพียงแค่ต้องเพิ่มบรรทัดนี้ภายใต้ "บรรทัดคำสั่งเหตุการณ์ post-build":
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"
คุณสามารถลงชื่อไฟล์ของคนอื่นหรือไฟล์ของคุณเองและมากเท่าที่คุณต้องการ
คำถามเก่า แต่ฉันประหลาดใจที่ยังไม่มีใครพูดถึง ilmerge ilmerge มาจาก Microsoft แต่ไม่ได้จัดส่งพร้อม VS หรือ SDK คุณสามารถดาวน์โหลดได้จากที่นี่แม้ว่า นอกจากนี้ยังมีพื้นที่เก็บข้อมูลGitHub คุณยังสามารถติดตั้งจาก nuget:
PM>Install-Package ilmerge
ใช้:
ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug
หากจำเป็นคุณสามารถสร้าง keyfile ของคุณเองโดยใช้ sn (จาก VS):
sn -k key.snk
1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
2> Install-Package -Name ILMerge
3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45
สถานการณ์: คุณมีโครงการ A, B, C, D ในโซลูชัน X, Y
โครงการ A, B, C ใน X โครงการ A, C, D ใน Y
ฉันต้องการใช้โครงการ C ในโครงการ A แต่หลังจากนั้นฉันไม่ได้ใช้ ใน bin Debug โครงการ A มี C.dll
ถ้าฉันรวบรวมวิธี X ทั้งหมดดี (ในโซลูชันนี้ฉันลบการอ้างอิง A -> C. ) แต่ในโซลูชัน YI จะได้รับปัญหานี้
วิธีแก้ไขคือลบ C.dll ในโครงการ A bin Debug
ขั้นแรกให้แน่ใจว่าแพ็คเกจ nuget ทั้งหมดเป็นรุ่นเดียวกันในทุกโครงการในโซลูชันของคุณ เช่นคุณไม่ต้องการให้โครงการหนึ่งอ้างอิง NLog 4.0.0.0 และโครงการอื่นอ้างอิง NLog 4.1.0.0 จากนั้นลองติดตั้งแพ็กเกจ nuget ใหม่ด้วย
อัพเดต - แพ็คเกจ - ติดตั้งใหม่
ฉันมีชุดประกอบของบุคคลที่ 3 ที่อ้างอิงโดยชุดประกอบของฉัน A และมีเพียง 2 ชิ้นเท่านั้นที่รวมอยู่ในชุดอ้างอิงโดยชุดประกอบ B ของฉันซึ่งอ้างอิงกลุ่ม A
การอ้างอิงที่ขาดหายไปไปยังแอสเซมบลีบุคคลที่สามถูกเพิ่มโดยคำสั่งแพ็คเกจการอัพเดทและข้อผิดพลาดก็หายไป