Как вы программно (повторно) подписываете сборку .NET с сильным именем?

Помимо вызова командной строки для добавления сильного имени в сборку, есть ли там какие-либо API-интерфейсы, которые позволят вам уйти в отставку после того, как она лишится своего сильного имени?

2 ответа

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

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

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

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

  • Получить экземпляр ICLRMetaHost или ICLRMetaHostPolicy, вызвав CLRCreateInstance.
  • В этом случае получите экземпляр текущей среды выполнения (т.е. экземпляр ICLRRuntimeInfo). Существует множество способов сделать это; см. MSDN для деталей gory.
  • Как только у вас есть экземпляр ICLRRuntimeInfo, получите экземпляр ICLRStrongName, вызвав метод ICLRRuntime 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. )

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


Вы можете заглянуть в mscoree сильные API имен, но я бы не рекомендовал его.

licensed under cc by-sa 3.0 with attribution.