Làm cách nào để sửa lỗi lắp ráp tham chiếu của Vectơ không có lỗi tên mạnh?


241

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?



1
Điều này nghe có vẻ như là một mẹo ngớ ngẩn nhưng nếu bạn thấy rằng hội đồng của bạn không được ký bất kể bạn làm gì, hãy kiểm tra cài đặt bản dựng của bạn; hãy nhớ rằng VS không xóa các kiến ​​trúc khác (Bất kỳ CPU, x64, v.v.) khi bạn xây dựng lại / dọn dẹp, do đó bạn có thể xem xét một dll lỗi thời từ một kiến ​​trúc khác.
jrh

Câu trả lời:


213

Để tránh lỗi này, bạn có thể:

  • Tải lắp ráp động, hoặc
  • Ký hội đồng bên thứ ba.

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ý) .

Ký kết các bên thứ ba

Nguyên tắc cơ bản để ký một đảng thirp là

  1. Tháo rời lắp ráp bằng cách sử dụng ildasm.exevà lưu ngôn ngữ trung gian (IL):

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
  2. Xây dựng lại và ký tên vào hội đồng:

    ilasm /dll /key=myKey.snk thirdPartyLib.il

Sửa các tài liệu tham khảo bổ sung

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.dllB.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
}

2
Vì vậy, việc ký kết hợp đồng là một tùy chọn, tôi không muốn tải động lắp ráp cũng như không ký. Tôi biết rằng việc đặt tên mạnh liên quan đến Bộ đệm ẩn hội đồng toàn cầu (GAC). Mặc dù vậy, tôi không muốn biến hội đồng của mình thành một phần của GAC ​​và chúng cũng không hiển thị COM. Tôi nhớ một phần nhớ về một cái gì đó chúng tôi có thể làm sẽ cho phép sử dụng lắp ráp này mà không cần ký tên. Nó là một nơi nào đó trong các thuộc tính tùy chọn hoặc như vậy. Tôi không theo dõi muốn đi theo cách đó?
Will Marcouiller

27
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.
OJ.

2
Liên kết đến .NET-fu là một tài nguyên tuyệt vời
TheDude

2
Mặc dù các bước trên sẽ hoạt động trong các tình huống "nhất", nhưng nó cực kỳ tốn thời gian và dễ bị lỗi và thất bại với các tham chiếu lắp ráp bạn bè trong số những thứ khác. Chỉ cần sử dụng tiện ích này để thực hiện tất cả tự động (phích cắm không biết xấu hổ): stackoverflow.com/a/19459609/564726
BrutalDev

1
@Roel Tôi đã trình bày chi tiết quá trình này đây delabs.io/the-12th-labor-of-a-net-developer-part-4
TheDude

98

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 .snktệ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

  • Nhấp chuột phải vào tập tin dự án
  • Chọn thuộc tính
  • Chọn "Tab ký" (ở bên trái)
  • Nhấp vào hộp kiểm "Đăng ký lắp ráp"
  • Sau đó <Browse>đến .snktậ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.


Nếu tôi không muốn ký vào hội đồng của tôi, tôi đã không ký nó ngay từ đầu!
mohas

Nếu bạn không tìm thấy tệp .snk: Mở thuộc tính dự án (của dự án bằng dự án có lỗi "tên mạnh"), hãy ký vào tab. Ở đó bạn sẽ thấy tệp được sử dụng để ký dự án (không phải lúc nào cũng là tệp có phần mở rộng .snk). Chỉ cần sao chép cài đặt này sang dự án khác.
Coder14

Như MrOli3000 chỉ ra, nó chỉ hoạt động nếu có một giải pháp thiếu tệp khóa tên mạnh. Nếu có nhiều dự án sẽ tham chiếu dự án chưa được ký, bạn nên tạo một tệp khóa tên mạnh mới để tránh mọi xung đột. Trong trường hợp của tôi, giải pháp đã không được xây dựng và tôi đang cố gắng khắc phục. Kể từ VS2017, định dạng là .pfx chứ không phải .snk, nhưng các bước đều giống nhau - Nhấp chuột phải vào giải pháp và chọn thuộc tính. Từ các tab được liệt kê ở bên trái, chọn "Ký". Nhấp vào hộp kiểm và chọn mới ... cung cấp tên! và Voila! xong rồi!)
Raj

58

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ập mô tả hình ảnh ở đây

(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 không kiểm tra cài đặt này trong dự án MVC của mình. Nhưng nó vẫn phàn nàn về một trong những phụ thuộc. Có bất kỳ thiết lập nào khác cho MVC không?
Hamid Mayeli

51

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 đó.


40

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.


23

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 :

  1. 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

  2. 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ã)

  3. Tạo khóa mới để ký dự án của bạn.

    D:/hiren> sn -k mykey.snk

  4. Bây giờ hãy ký vào thư viện của bạn bằng cách sử dụng ilasmlệnh.

    D:/hiren> ilasm /dll /key=mykey.snk Test.il


Liên kết của bạn đã thực hiện các mẹo! Cảm ơn! Và nó giải thích cách tạo mykey.snk (những câu trả lời khác không nói như thế nào)
Nicolas VerHELST

15

Làm thế nào để ký một hội đồng bên thứ ba không dấu

  1. Mở Prompt của nhà phát triển cho Visual Studio. Công cụ này có sẵn trong các chương trình Window của bạn và có thể được tìm thấy bằng cách sử dụng tìm kiếm Windows mặc định.
  2. Đảm bảo lời nhắc của bạn có quyền truy cập vào các công cụ sau bằng cách thực hiện chúng một lần: sn ildasmilasm
  3. Điều hướng đến thư mục nơi Cool.L Library.dll của bạn được đặt
  4. sn –k Cool.Library.snk để tạo một cặp khóa mới
  5. ildasm Cool.Library.dll /out:Cool.Library.il để tháo rời thư viện
  6. move Cool.Library.dll Cool.Library.unsigned.dll để giữ thư viện gốc làm bản sao lưu
  7. ilasm 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ẽ
  8. 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.

6

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 đó.


Cảm ơn bạn! Vì câu trả lời của bạn, tôi đã kiểm tra lại vấn đề của mình (Đã đóng) và tìm thấy gói nuget đã đóng.
Kiryl

6

Tôi đã chạy vào đây với một dll ServiceStack tôi đã cài đặt với nuget. Hóa ra có một bộ dll khác có sẵn được dán nhãn. Sẽ không phải là câu trả lời cho tất cả mọi người, nhưng bạn có thể chỉ cần kiểm tra phiên bản đã ký của hội đồng.ServiceStack. Đã ký


2

Đố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.


2

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 ý.

nhập mô tả hình ảnh ở đây


5
Đây là một loại ký khác nhau. Những gì OP đang yêu cầu là làm thế nào để ký một hội đồng .NET với một tên mạnh. Bạn đang trình bày cách ký một tệp thực thi với chứng chỉ ký mã. Những thứ khác.
Blue Toque

2

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
Tôi gặp vấn đề với WireMock.Net, cuối cùng nó cũng hoạt động, nhưng tôi mất một ít thời gian để tìm ra các lệnh PowerShell. Đặc biệt là toàn bộ các đối số / lib để cuối cùng có được ILMerge để ký hợp đồng.
François

1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
François

2> Install-Package -Name ILMerge
François

3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
François

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
François

1

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


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.