public InstallReference GetNextReference() { IInstallReferenceItem item = null; int hr = refEnum.GetNextInstallReferenceItem(out item, 0, IntPtr.Zero); if ((uint)hr == 0x80070103) { // ERROR_NO_MORE_ITEMS return(null); } if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } IntPtr refData; InstallReference instRef = new InstallReference(Guid.Empty, String.Empty, String.Empty); hr = item.GetReference(out refData, 0, IntPtr.Zero); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } Marshal.PtrToStructure(refData, instRef); return(instRef); }
public static IEnumerable <InstallReference> GetInstallReferences(AssemblyName assemblyName) { IAssemblyName fusionAssemblyName = null; ComCheck(FusionApi.CreateAssemblyNameObject(out fusionAssemblyName, assemblyName.GetFullyQualifiedName(), CreateAssemblyNameObjectFlags.ParseDisplayName, IntPtr.Zero)); IInstallReferenceEnum installReferenceEnum = null; ComCheck(FusionApi.CreateInstallReferenceEnum(out installReferenceEnum, fusionAssemblyName, 0, IntPtr.Zero)); IInstallReferenceItem item = null; do { int hResult = installReferenceEnum.GetNextInstallReferenceItem(out item, 0, IntPtr.Zero); if ((uint)hResult == 0x80070103) // ERROR_NO_MORE_ITEMS { yield break; } ComCheck(hResult); IntPtr refData; ComCheck(item.GetReference(out refData, 0, IntPtr.Zero)); FusionInstallReference fusionReference = new FusionInstallReference(); Marshal.PtrToStructure(refData, fusionReference); var reference = new InstallReference(InstallReferenceGuid.ToType(fusionReference.GuidScheme), fusionReference.Identifier, fusionReference.NonCanonicalData); yield return(reference); } while (true); }