Как использовать ICLRStrongName в .NET 4? - PullRequest
1 голос
/ 21 октября 2010

В связи с моими предыдущими публикациями я перехожу на .NET 4. Я обнаружил, что использование предыдущего StrongName.h для получения моего ключа подписи сборки в неуправляемом коде теперь устарело, и мне нужно использовать MetaHost.h и ICLRStrongName :: StrongNameTokenFromAssembly.

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

1 Ответ

2 голосов
/ 21 октября 2010

Ого ... это требовало много взлома. Вот и мы!

ICLRMetaHost *pMetaHost = NULL;
HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost,
               IID_ICLRMetaHost, (LPVOID*)&pMetaHost);  
if(hr == S_OK)
{
  WCHAR version[100];
  DWORD size;

  hr == pMetaHost->GetVersionFromFile(MyGetApplicationExecutablePath().c_str(), (LPWSTR) &version, &size);
  if(hr == S_OK)
  {
     LPWSTR assemblyVer = version;
     ICLRRuntimeInfo *pRuntimInfo = NULL;

     hr = pMetaHost->GetRuntime(assemblyVer, IID_ICLRRuntimeInfo, (LPVOID*)&pRuntimInfo);
     if (hr == S_OK)
     {
        ICLRStrongName *pStrongName = NULL;
        hr = pRuntimInfo->GetInterface(CLSID_CLRStrongName, IID_ICLRStrongName, (LPVOID*)&pStrongName);

        if(hr == S_OK)
        {
           pStrongName->StrongNameTokenFromAssembly(MyGetApplicationExecutablePath().c_str(), &token, &len);
           DWORD verified = 0;
           BOOLEAN sigVerified = pStrongName->StrongNameSignatureVerification(MyGetApplicationExecutablePath().c_str(), SN_INFLAG_FORCE_VER  , &verified);
           if (!verified)
           {
              //Do something nasty here if the Signature verification failed
           }
           pStrongName->StrongNameFreeBuffer(token);
        }
     }
  }

}

...