2009-03-28 48 views
6

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?

+0

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) –

+0

Bạn có tìm cách để làm điều này không? – DannyT

+0

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

Trả lời

2

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.

+0

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

+0

Các API này không được chấp nhận bắt đầu bằng .NET 4. –

+0

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

3

Đ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ặc ICLRMetaHostPolicy bằng cách gọi CLRCreateInstance.
  • 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ủa ICLRStrongName bằng cách gọi ICLRRuntime 's GetInterface phương pháp, đi qua trong CLSID_CLRStrongNameIID_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ó.

Các vấn đề liên quan