2009-03-28 3 views
6

Помимо вызова командной строки, чтобы добавить сильное имя в сборку, существуют ли какие-либо API-интерфейсы, которые позволят вам уйти в отставку после того, как она лишится своего сильного имени?Как вы программно (запишите) сборку .NET с сильным именем?

+0

Я удалил ответ (командная строка); Я не знаю других способов сделать это, кроме командной строки ('sn -R' и т. Д.) –

+0

Вы нашли способ сделать это? – DannyT

+0

Сборка не обязательно «лишена» ее сильного имени, так как она создается без нее, или тот, который у нее есть, становится недействительным (из-за вмешательства в фальсификацию). –

ответ

2

Вы можете посмотреть mscoree's strong name APIs, но я бы не рекомендовал его.

+0

Почему бы и нет? Я тоже хочу это сделать, и я не хочу запускать sn.exe (главным образом потому, что я хочу более «элегантный» механизм) – DannyT

+0

Эти API устарели, начиная с .NET 4. –

+0

Они только устарели из-за внедрения in-proc SxS в .NET 4; то есть глобальные статические функции устарели. Неуправляемый сильный именованный API сам по себе не устарел - вам просто нужно вызвать его из интерфейсов хостинга (в частности, ICLRStrongName: http://msdn.microsoft.com/en-us/library/dd409349.aspx). – hbw

3

Это зависит от того, что вы подразумеваете под сборкой, «лишенной ее сильного имени». Если узел не сильно назван, ничто (даже не sn.exe) не может уйти в отставку, пока оно не будет перестроено с сильным именем.

Но ответ на ваш вопрос: все функциональные возможности именования отображаются через CLR unmanaged strong naming API. В частности, вы хотите StrongNameSignatureGenerationEx, который, как вы заметили, функционально эквивалентен команде sn -R[a].

Это, как говорится, много проще и проще просто вызвать sn.exe себя. Доступ к неуправляемым сильным API-интерфейсам имен не для слабонервных, так как (начиная с .NET 4) вы вынуждены сначала проходить через API-интерфейсы метаистов CLR. По этой причине вы также сильно застряли в том, что вам нужно делать это полностью в неуправляемом коде. (Я нашел managed wrapper from Microsoft on CodePlex, но я не мог заставить StrongNameSignatureGenerationEx работать должным образом через него.)

Если у вас есть, хотя, вот примерный план того, как получить доступ к сильному API для именования из неуправляемого кода:

  • Получить экземпляр ICLRMetaHost или ICLRMetaHostPolicy по телефону CLRCreateInstance.
  • В этом случае получить экземпляр текущей среды выполнения (то есть пример ICLRRuntimeInfo). Существует множество способов сделать это; см. MSDN для подробностей.
  • После того, как у вас есть экземпляр ICLRRuntimeInfo, получить экземпляр ICLRStrongName по телефону ICLRRuntime «s GetInterface метода, передавая CLSID_CLRStrongName и IID_ICLRStrongName для идентификаторов классов/интерфейсов.

Теперь, когда у вас есть экземпляр ICLRStrongName, наконец, вы можете позвонить StrongNameSignatureGenerationEx использовать его:

// 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 

(Необязательно, если вы хотите, чтобы подписать с ключевым контейнером вместо пары ключей в .snk, вы может передать имя ключевого контейнера в качестве второго аргумента и оставить аргументы пары blob/size аргументом как NULL.)

Практический результат: Как вы можете видеть, если вам действительно не нужно проходить через сильный именованный API , Это is much проще (пере) подписывать сборку, просто вызывая sn.exe.