Ngoài việc gọi dòng lệnh để thêm một tên mạnh vào một assembly, có API nào ngoài đó cho phép bạn từ chức một assembly khi nó đã bị tước tên mạnh của nó không?Làm thế nào để bạn lập trình (lại) ký một hội đồng .NET với tên mạnh?
Trả lời
Bạn có thể xem xét mscoree
's strong name APIs, nhưng tôi sẽ không khuyên bạn nên sử dụng.
Tại sao không? Tôi cũng đang tìm cách làm điều này và không muốn đẻ trứng.exe (chủ yếu là vì tôi muốn có một cơ chế "thanh lịch" hơn) – DannyT
Các API này không được chấp nhận bắt đầu bằng .NET 4. –
Chúng chỉ bị phản đối vì sự ra đời của SxS trong .NET 4.0; tức là các hàm tĩnh toàn cầu không được chấp nhận. Bản thân API đặt tên mạnh mẽ không được quản lý không bị phản đối — bạn chỉ cần gọi nó từ giao diện lưu trữ thay thế (cụ thể là ICLRStrongName: http://msdn.microsoft.com/en-us/library/dd409349.aspx). – hbw
Điều đó tùy thuộc vào ý nghĩa của một hội đồng là "bị tước bỏ tên mạnh". Nếu một assembly không được đặt tên mạnh, không có gì (thậm chí không sn.exe) có thể từ chức assembly cho đến khi nó được xây dựng lại với một tên mạnh.
Nhưng để trả lời câu hỏi của bạn: tất cả chức năng đặt tên mạnh được hiển thị qua số unmanaged strong naming API của CLR. Cụ thể, bạn muốn StrongNameSignatureGenerationEx
, như bạn sẽ thấy, có chức năng tương đương với lệnh sn -R[a]
.
Điều đó đang được nói, nó là nhiều đơn giản và dễ dàng hơn để chỉ gọi số sn.exe
. Việc truy cập các API tên mạnh mẽ không được quản lý không dành cho những người yếu tim, vì (theo .NET 4), bạn buộc phải đi qua các API metahosting của CLR trước tiên. Vì lý do này, bạn cũng khá nhiều khó khăn khi phải làm điều này hoàn toàn trong mã không được quản lý. (Tôi đã tìm thấy một managed wrapper from Microsoft on CodePlex, nhưng tôi không thể có được StrongNameSignatureGenerationEx
để hoạt động đúng thông qua nó.)
Nếu bạn phải, tuy nhiên, đây là một phác thảo sơ bộ như thế nào để truy cập vào các API đặt tên mạnh từ mã không được quản lý:
- Nhận ví dụ
ICLRMetaHost
hoặcICLRMetaHostPolicy
bằng cách gọiCLRCreateInstance
. - Với trường hợp đó, hãy lấy một phiên bản của thời gian chạy hiện tại (ví dụ: một cá thể
ICLRRuntimeInfo
). Có rất nhiều cách để làm điều này; xem MSDN để biết chi tiết đẫm máu. - Một khi bạn có một thể hiện của
ICLRRuntimeInfo
, có được một thể hiện củaICLRStrongName
bằng cách gọiICLRRuntime
'sGetInterface
phương pháp, đi qua trongCLSID_CLRStrongName
vàIID_ICLRStrongName
cho định danh lớp/giao diện.
Bây giờ bạn có một thể hiện của ICLRStrongName
, bạn có thể cuối cùng gọi StrongNameSignatureGenerationEx
sử dụng nó:
// This is the ICLRStrongName instance you'll need. Assume GetStrongNameAPI
// corresponds to an implementation of the rough process I outlined above.
ICLRStrongName *snAPI = GetStrongNameAPI();
// You'll have to load the .snk file into memory yourself using the Win32
// file APIs, the details of which I've omitted for the sake of brevity.
BYTE *keyPairBlob = NULL;
DWORD keyPairBlobSize = 0;
LoadKeyPair(&keyPairBlob, &keyPairBlobSize);
// Once you've got the key pair blob, you can now (re-)sign the assembly
HRESULT hr = snAPI->StrongNameSignatureGenerationEx(
L"path\\to\\your\\assembly.dll",
NULL,
keyPairBlob,
keyPairBlobSize,
NULL,
NULL,
0
);
// Do whatever error handling needs to be done with the given HRESULT
(Tùy chọn, nếu bạn muốn đăng nhập với một kho chứa khóa thay vì một cặp khóa .snk
, bạn có thể chuyển vào tên của vùng chứa khóa làm đối số thứ hai và để lại cặp đối số blob/kích thước khóa như NULL.)
Bottom line: Như bạn có thể thấy, trừ khi bạn thực sự phải trải qua API đặt tên mạnh , nó là nhiều dễ dàng hơn để (lại) ký một hội đồng bằng cách chỉ cần gọi sn.exe chính nó.
- 1. Ký một F # hội (tên Mạnh component)
- 2. Làm thế nào để tôi có được tên mạnh mẽ của một hội đồng?
- 3. Làm thế nào để ký tên với một tên mạnh mẽ bảo vệ chống giả mạo một tập hợp các hội đồng?
- 4. Chỉ ký các hội đồng có tên mạnh trong khi phát hành
- 5. Làm cách nào để đọc thông tin chữ ký số từ một hội đồng .Net đã ký?
- 6. IronRuby - làm thế nào để yêu cầu. NET cụm mà không có tên mạnh?
- 7. Làm thế nào để khai báo một hội bạn bè?
- 8. Lấy ngày của một hội đồng .NET
- 9. Tài nguyên nhúng theo lập trình trong một hội đồng .NET
- 10. ký hợp đồng với một tên mạnh, ok, nhưng nếu một số bên thứ ba DLL không được ký kết?
- 11. Làm thế nào để tải một loại từ tên của loại và tên của hội đồng
- 12. Bạn bè hội đồng trong C#
- 13. Làm thế nào để tham khảo một không gian tên từ một hội đồng cụ thể?
- 14. Mỗi dự án có được ký với một Khóa Tên mạnh Riêng biệt (.snk) không?
- 15. Làm thế nào để bạn ký một assembly được tạo ra bởi một hoạt động ILMerge?
- 16. Làm thế nào để bạn lập trình một thuộc tính?
- 17. Tải hội đồng WinRT từ .NET
- 18. C#: tại sao ký một hội đồng?
- 19. Làm thế nào để bạn lập trình đồng hồ phần cứng trên Linux?
- 20. Obfuscating nhiều hội đồng liên quan. NET với babel obfuscator
- 21. Làm cách nào để gọi một hội đồng .NET từ C/C++?
- 22. lợi ích của việc ký dll với tên mạnh
- 23. Làm thế nào để các.NET Runtime Xác định vị trí không mạnh tên 'Assemblies?
- 24. đặt tên mạnh trong .net
- 25. Hội đồng .NET là gì?
- 26. Đặt tên mạnh với PFX
- 27. C# - bạn có thể tạo một tham chiếu lắp ráp "yếu" với một assembly có tên mạnh là
- 28. Cách đánh dấu một hội đồng .net là an toàn?
- 29. Sử dụng các loại tên và không gian tên giống nhau trong 2 hội đồng .NET
- 30. Làm thế nào để tái sử dụng một hội đồng .Net từ một ứng dụng C tinh khiết
Tôi đã xóa câu trả lời (dòng lệnh); Tôi không biết bất kỳ cách nào khác để làm điều này ngoại trừ dòng lệnh ('sn -R' etc) –
Bạn có tìm cách để làm điều này không? – DannyT
Một hội đồng không nhất thiết phải "Stripped" của tên mạnh của nó rất nhiều vì nó được tạo ra mà không có một, hoặc một mà nó đã trở thành không hợp lệ (do giả mạo). –