Помимо вызова командной строки, чтобы добавить сильное имя в сборку, существуют ли какие-либо API-интерфейсы, которые позволят вам уйти в отставку после того, как она лишится своего сильного имени?Как вы программно (запишите) сборку .NET с сильным именем?
ответ
Вы можете посмотреть mscoree
's strong name APIs, но я бы не рекомендовал его.
Почему бы и нет? Я тоже хочу это сделать, и я не хочу запускать sn.exe (главным образом потому, что я хочу более «элегантный» механизм) – DannyT
Эти API устарели, начиная с .NET 4. –
Они только устарели из-за внедрения in-proc SxS в .NET 4; то есть глобальные статические функции устарели. Неуправляемый сильный именованный API сам по себе не устарел - вам просто нужно вызвать его из интерфейсов хостинга (в частности, ICLRStrongName: http://msdn.microsoft.com/en-us/library/dd409349.aspx). – hbw
Это зависит от того, что вы подразумеваете под сборкой, «лишенной ее сильного имени». Если узел не сильно назван, ничто (даже не 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
«sGetInterface
метода, передавая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.
Я удалил ответ (командная строка); Я не знаю других способов сделать это, кроме командной строки ('sn -R' и т. Д.) –
Вы нашли способ сделать это? – DannyT
Сборка не обязательно «лишена» ее сильного имени, так как она создается без нее, или тот, который у нее есть, становится недействительным (из-за вмешательства в фальсификацию). –