in src/Microsoft.VisualStudio.Composition/RuntimeExportProviderFactory+RuntimeExportProvider.cs [301:356]
private ExportedValueConstructor GetExportedValueHelper(RuntimeComposition.RuntimeImport import, RuntimeComposition.RuntimeExport export, RuntimeComposition.RuntimePart exportingRuntimePart, TypeRef originalPartTypeRef, TypeRef constructedPartTypeRef, RuntimePartLifecycleTracker? importingPartTracker)
{
Requires.NotNull(import, nameof(import));
Requires.NotNull(export, nameof(export));
Requires.NotNull(exportingRuntimePart, nameof(exportingRuntimePart));
Requires.NotNull(originalPartTypeRef, nameof(originalPartTypeRef));
Requires.NotNull(constructedPartTypeRef, nameof(constructedPartTypeRef));
bool nonSharedInstanceRequired = !exportingRuntimePart.IsShared || import.IsNonSharedInstanceRequired;
Requires.Argument(importingPartTracker is object || !nonSharedInstanceRequired, nameof(importingPartTracker), "Value required for non-shared parts.");
RuntimePartLifecycleTracker? nonSharedPartOwner = nonSharedInstanceRequired && importingPartTracker!.IsNonShared && !import.IsExportFactory ? importingPartTracker : null;
PartLifecycleTracker partLifecycle = this.GetOrCreateValue(
originalPartTypeRef,
constructedPartTypeRef,
exportingRuntimePart.SharingBoundary,
import.Metadata,
nonSharedInstanceRequired,
nonSharedPartOwner);
var faultCallback = this.faultCallback;
Func<object?> exportedValue = () =>
{
try
{
bool fullyInitializedValueIsRequired = IsFullyInitializedExportRequiredWhenSettingImport(import.IsLazy, import.ImportingParameterRef != null);
if (!fullyInitializedValueIsRequired && importingPartTracker != null && !import.IsExportFactory)
{
importingPartTracker.ReportPartiallyInitializedImport(partLifecycle);
}
if (export.MemberRef != null)
{
object? part = export.Member!.IsStatic()
? null
: (fullyInitializedValueIsRequired
? partLifecycle.GetValueReadyToExpose()
: partLifecycle.GetValueReadyToRetrieveExportingMembers());
return GetValueFromMember(part, export.Member!, import.ImportingSiteElementType, export.ExportedValueTypeRef.Resolve());
}
else
{
return fullyInitializedValueIsRequired
? partLifecycle.GetValueReadyToExpose()
: partLifecycle.GetValueReadyToRetrieveExportingMembers();
}
}
catch (Exception e)
{
// Let the MEF host know that an exception has been thrown while resolving an exported value
faultCallback?.Invoke(e, import, export);
throw;
}
};
return new ExportedValueConstructor(partLifecycle, exportedValue);
}