Tôi đã thêm một hội đồng được đặt tên yếu vào dự án Visual Studio 2005 của tôi (được đặt tên mạnh mẽ). Bây giờ tôi đang nhận được lỗi:
"Hội đồng tham chiếu 'xxxxxxxx' không có tên mạnh"
Tôi có cần ký hợp đồng bên thứ ba này không?
Tôi đã thêm một hội đồng được đặt tên yếu vào dự án Visual Studio 2005 của tôi (được đặt tên mạnh mẽ). Bây giờ tôi đang nhận được lỗi:
"Hội đồng tham chiếu 'xxxxxxxx' không có tên mạnh"
Tôi có cần ký hợp đồng bên thứ ba này không?
Câu trả lời:
Để tránh lỗi này, bạn có thể:
Bạn sẽ tìm thấy hướng dẫn về việc ký kết các bên thứ ba trong .NET-fu: Ký một hội đồng chưa ký (Không có sự chậm trễ ký) .
Nguyên tắc cơ bản để ký một đảng thirp là
Tháo rời lắp ráp bằng cách sử dụng ildasm.exe
và lưu ngôn ngữ trung gian (IL):
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
Xây dựng lại và ký tên vào hội đồng:
ilasm /dll /key=myKey.snk thirdPartyLib.il
Các bước trên hoạt động tốt trừ khi hội đồng bên thứ ba ( A.dll ) của bạn tham chiếu thư viện khác ( B.dll ) cũng phải được ký. Bạn có thể tháo rời, xây dựng lại và ký cả A.dll và B.dll bằng các lệnh trên, nhưng trong thời gian chạy, việc tải B.dll sẽ không thành công vì A.dll ban đầu được xây dựng với tham chiếu đến phiên bản B.dll không dấu .
Cách khắc phục sự cố này là vá tệp IL được tạo ở bước 1 ở trên. Bạn sẽ cần thêm mã thông báo khóa công khai của B.dll vào tham chiếu. Bạn nhận được mã thông báo này bằng cách gọi
sn -Tp B.dll
sẽ cung cấp cho bạn đầu ra sau:
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
Dòng cuối cùng chứa mã thông báo khóa công khai. Sau đó, bạn phải tìm kiếm IL của A.dll để tham khảo B.dll và thêm mã thông báo như sau:
.assembly extern /*23000003*/ MyAssemblyName
{
.publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )
.ver 10:0:0:0
}
Mở rộng tệp dự án đang sử dụng dự án không "có khóa tên mạnh" và tìm .snk
tệp (.StrongNameKey).
Duyệt qua tệp này trong Windows Explorer (để bạn biết nó ở đâu).
Quay lại Visual Studio trong dự án không "có khóa tên mạnh", hãy làm
<Browse>
đến .snk
tập tin bạn tìm thấy trước đóĐiều đó sẽ làm các trick. Điều này đã giải quyết một vấn đề cho tôi đối với một dự án bằng cách sử dụng một biểu mẫu bên trong một dự án khác trong cùng một giải pháp.
Tôi hy vọng nó sẽ giúp.
Tôi đã tìm kiếm giải pháp cho cùng một vấn đề và bỏ chọn tùy chọn "Đăng ký lắp ráp" cho tôi:
(như bạn có thể nhận thấy ảnh chụp màn hình đến từ VS2010 nhưng hy vọng nó sẽ giúp được ai đó)
Tôi đã viết một công cụ để tự động lắp ráp các dấu hiệu tên mạnh bao gồm cả các cụm mà bạn không có mã nguồn cho hoặc các dự án đã bị bỏ rơi. Nó sử dụng nhiều kỹ thuật được mô tả trong các câu trả lời một cách đơn giản mà không có bất kỳ sai sót hay nhược điểm nào của các công cụ hiện có hoặc hướng dẫn ngày.
http://brutaldev.com/post/2013/10/18/NET-Assugging-Strong-Name-Signer
Hy vọng điều này sẽ giúp bất cứ ai cần ký hợp đồng bên thứ ba mà không phải nhảy qua vòng để đến đó.
Bạn có thể sử dụng các cụm không dấu nếu lắp ráp của bạn cũng không dấu.
Ký kết hội nghị bên thứ ba làm việc cho tôi:
http://www.codeproject.com/Tips/341645/Referenced-assinstall-does-not-have-a-strong-name
EDIT : Tôi đã học được rằng rất hữu ích khi đăng các bước trong trường hợp bài viết được liên kết không còn hiệu lực. Tất cả tín dụng được chuyển đến Hiren Khirsaria :
Chạy dấu nhắc lệnh của studio và đi đến thư mục chứa DLL của bạn.
For Example my DLL is located in
D:/hiren/Test.dll
Bây giờ tạo tệp IL bằng lệnh bên dưới.
D:/hiren> ildasm /all /out=Test.il Test.dll
(lệnh này tạo thư viện mã)
Tạo khóa mới để ký dự án của bạn.
D:/hiren> sn -k mykey.snk
Bây giờ hãy ký vào thư viện của bạn bằng cách sử dụng ilasm
lệnh.
D:/hiren> ilasm /dll /key=mykey.snk Test.il
sn
ildasm
vàilasm
sn –k Cool.Library.snk
để tạo một cặp khóa mớiildasm Cool.Library.dll /out:Cool.Library.il
để tháo rời thư việnmove Cool.Library.dll Cool.Library.unsigned.dll
để giữ thư viện gốc làm bản sao lưuilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
để lắp ráp lại thư viện với một tên mạnh mẽpowershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
để có được lắp ráp đầy đủ tên đủ điều kiện. Bạn sẽ cần bit này nếu bạn phải tham chiếu DLL trong các tệp cấu hình bên ngoài như web.config hoặc app.config.Tôi gặp vấn đề này đối với một ứng dụng được đặt tên mạnh sau đó phải thay đổi nó để tham chiếu một hội đồng không được đặt tên mạnh, vì vậy tôi đã bỏ chọn 'Ký tên hội đồng' trong phần Ký kết thuộc tính dự án nhưng nó vẫn phàn nàn. Tôi đã hình dung nó phải là một vật phẩm ở đâu đó gây ra vấn đề vì tôi đã làm mọi thứ khác một cách chính xác và chỉ có thế. Tôi đã tìm và xóa dòng: [assembly: assemblyKeyFile ("yourkeyfilename.snk")] khỏi tệp assemblyInfo.cs của nó. Sau đó không xây dựng khiếu nại sau đó.
Đối với tôi, vấn đề của tôi là tôi đã cài đặt hai Gói NuGet giống nhau với các Phiên bản khác nhau.
Loại bỏ các "Ký tên vào lắp ráp" dấu kiểm dưới "Ký" tác phẩm tab như @Michal Stefanow nói.
Thêm vào đây là cách đơn giản nhất để ký các tệp của riêng bạn và / hoặc các tệp của người khác. Bạn chỉ cần thêm dòng này trong "Dòng lệnh sự kiện sau xây dựng":
"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)"
Bạn có thể ký các tệp của người khác hoặc các tệp của riêng bạn và bao nhiêu tùy ý.
Câu hỏi cũ, nhưng tôi ngạc nhiên không ai đề cập đến ilmerge. ilmerge là của Microsoft, nhưng không được cung cấp với VS hoặc SDK. Bạn có thể tải nó từ đây mặc dù. Ngoài ra còn có một kho lưu trữ github . Bạn cũng có thể cài đặt từ nuget:
PM>Install-Package ilmerge
Để sử dụng:
ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug
Nếu cần, Bạn có thể tạo keyfile của riêng mình bằng sn (từ 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
Tình huống: Bạn đã có dự án A, B, C, D trong giải pháp X, Y
Dự án A, B, C trong X Dự án A, C, D tại Y
Tôi cần sử dụng dự án C trong dự án A, nhưng sau đó tôi không sử dụng. Trong dự án bin Debug A có C.dll.
Nếu tôi biên dịch giải pháp X, tất cả đều tốt (trong giải pháp này tôi xóa tham chiếu A -> C.), nhưng trong giải pháp YI gặp vấn đề này.
Giải pháp là xóa C.dll trong dự án A bin Debug
Trước tiên, hãy đảm bảo tất cả các gói nuget ở cùng một phiên bản trên tất cả các dự án trong giải pháp của bạn. ví dụ: bạn không muốn một dự án tham chiếu NLog 4.0.0.0 và một dự án khác để tham chiếu NLog 4.1.0.0. Sau đó thử cài đặt lại các gói nuget với
Cập nhật-Gói -reinstall
Tôi đã có 3 hội đồng bên thứ 3 được tham chiếu bởi hội đồng A của tôi và chỉ có 2 hội nghị được đưa vào Tài liệu tham khảo bởi hội đồng B của tôi cũng tham chiếu A.
Tham chiếu bị thiếu đối với lắp ráp bên thứ 3 đã được thêm bởi lệnh gói cập nhật và lỗi đã biến mất.