HRESULT BindingLog::LogAssemblyName(LPCWSTR pwzPrefix, AssemblyName *pAssemblyName) { HRESULT hr = S_OK; BINDER_LOG_ENTER(L"BindingLog::LogAssemblyName"); PathString assemblyDisplayName; // Verify input arguments IF_FALSE_GO(pwzPrefix != NULL); IF_FALSE_GO(pAssemblyName != NULL); pAssemblyName->GetDisplayName(assemblyDisplayName, AssemblyName::INCLUDE_VERSION | AssemblyName::INCLUDE_ARCHITECTURE); IF_FAIL_GO(Log(pwzPrefix, assemblyDisplayName)); Exit: BINDER_LOG_LEAVE_HR(L"BindingLog::LogAssemblyName", hr); return hr; }
/* static */ HRESULT BindingLog::CreateInContext(ApplicationContext *pApplicationContext, AssemblyName *pAssemblyName, PEAssembly *pParentAssembly) { HRESULT hr = S_OK; BINDER_LOG_ENTER(L"BindingLog::CreateInContext (pAssemblyName)"); if (IsLoggingNeeded()) { SmallStackSString emptyString; IF_FALSE_GO(pAssemblyName != NULL); IF_FAIL_GO(CreateInContext(pApplicationContext, pAssemblyName, emptyString, pParentAssembly)); } Exit: BINDER_LOG_LEAVE_HR(L"BindingLog::CreateInContext (pAssemblyName)", hr); return hr; }
/* static */ HRESULT Compatibility::Retarget(AssemblyName *pAssemblyName, AssemblyName **ppRetargetedAssemblyName, BOOL *pfIsRetargeted) { HRESULT hr = S_OK; BINDER_LOG_ENTER(W("Compatibility::Retarget")); IF_FALSE_GO(pAssemblyName != NULL); IF_FALSE_GO(ppRetargetedAssemblyName != NULL); BINDER_LOG_ASSEMBLY_NAME(W("source"), pAssemblyName); if (pfIsRetargeted) { *pfIsRetargeted = FALSE; } #ifdef FEATURE_CORESYSTEM // Apply retargeting only for strong-named culture neutral assemblies if (pAssemblyName->IsStronglyNamed() && pAssemblyName->GetDeNormalizedCulture().IsEmpty()) { ReleaseHolder<AssemblyName> pRetargetedAssemblyName; SString &simpleName = pAssemblyName->GetSimpleName(); AssemblyVersion *pAssemblyVersion = pAssemblyName->GetVersion(); SString publicKeyToken; TextualIdentityParser::BlobToHex(pAssemblyName->GetPublicKeyTokenBLOB(), publicKeyToken); // Perform linear search for matching assembly. Legacy Fusion also does that for (unsigned int i = 0; i < LENGTH_OF(arRetargetConfig); i++) { #ifdef FEATURE_LEGACYNETCF if (!RuntimeIsLegacyNetCF(0) && arRetargetConfig[i].fMangoOnly == TRUE) continue; #endif if (IsMatchingString(simpleName, arRetargetConfig[i].pwzSimpleName) && IsMatchingVersion(pAssemblyVersion, arRetargetConfig[i].pwzVersion) && IsMatchingString(publicKeyToken, arRetargetConfig[i].pwzPublicKeyToken)) { AssemblyVersion newAssemblyVersion; IF_FALSE_GO(newAssemblyVersion.SetVersion(arRetargetConfig[i].pwzNewVersion)); SAFE_NEW(pRetargetedAssemblyName, AssemblyName); if (arRetargetConfig[i].pwzNewSimpleName != NULL) { pRetargetedAssemblyName-> GetSimpleName().Set(arRetargetConfig[i].pwzNewSimpleName); } else { pRetargetedAssemblyName->GetSimpleName().Set(simpleName); } pRetargetedAssemblyName->SetVersion(&newAssemblyVersion); SBuffer newPublicKeyTokenBlob; SmallStackSString newPublicKeyToken(arRetargetConfig[i].pwzNewPublicKeyToken); TextualIdentityParser::HexToBlob(newPublicKeyToken, FALSE /* fValidateHex */, TRUE /* fIsToken */, newPublicKeyTokenBlob); pRetargetedAssemblyName->GetPublicKeyTokenBLOB().Set(newPublicKeyTokenBlob); BINDER_LOG_ASSEMBLY_NAME(W("retargeted"), pRetargetedAssemblyName); *ppRetargetedAssemblyName = pRetargetedAssemblyName.Extract(); if (pfIsRetargeted) { *pfIsRetargeted = TRUE; } GO_WITH_HRESULT(S_OK); } } // Create a clone without retargetable flag if (pAssemblyName->GetIsRetargetable()) { IF_FAIL_GO(pAssemblyName->Clone(&pRetargetedAssemblyName)); pRetargetedAssemblyName->SetIsRetargetable(FALSE); *ppRetargetedAssemblyName = pRetargetedAssemblyName.Extract(); } else { pAssemblyName->AddRef(); *ppRetargetedAssemblyName = pAssemblyName; } } else #endif // FEATURE_CORESYSTEM { pAssemblyName->AddRef(); *ppRetargetedAssemblyName = pAssemblyName; } Exit: BINDER_LOG_LEAVE_HR(W("Compatibility::Retarget"), hr); return hr; }