Как программно (пере) подписать сборку .NET строгим именем? - PullRequest
6 голосов
/ 28 марта 2009

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

Ответы [ 2 ]

3 голосов
/ 11 октября 2010

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

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

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

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

  • Получите экземпляр ICLRMetaHost или ICLRMetaHostPolicy, позвонив по номеру CLRCreateInstance.
  • С этим экземпляром получите экземпляр текущего времени выполнения (то есть экземпляр ICLRRuntimeInfo). Есть множество способов сделать это; см. MSDN для подробностей.
  • Получив экземпляр 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, вы можете передать имя контейнера ключей в качестве второго аргумента и оставить аргументы пары больших двоичных объектов / размера как NULL. )

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

2 голосов
/ 28 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...