public override BoundNode VisitNoPiaObjectCreationExpression(BoundNoPiaObjectCreationExpression node) { // For the NoPIA feature, we need to gather the GUID from the coclass, and // generate the following: // // (IPiaType)System.Activator.CreateInstance(System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(new Guid(GUID))) // // If System.Runtime.InteropServices.Marshal.GetTypeFromCLSID is not available (older framework), // System.Type.GetTypeFromCLSID() is used to get the type for the CLSID: // // (IPiaType)System.Activator.CreateInstance(System.Type.GetTypeFromCLSID(new Guid(GUID))) SyntaxNode oldSyntax = _factory.Syntax; _factory.Syntax = node.Syntax; var ctor = _factory.WellKnownMethod(WellKnownMember.System_Guid__ctor); BoundExpression newGuid; if (ctor is { })
public override BoundNode VisitNoPiaObjectCreationExpression(BoundNoPiaObjectCreationExpression node) { // For the NoPIA feature, we need to gather the GUID from the coclass, and // generate the following: // // (IPiaType)System.Activator.CreateInstance(System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(new Guid(GUID))) // // If System.Runtime.InteropServices.Marshal.GetTypeFromCLSID is not available (older framework), // System.Type.GetTypeFromCLSID() is used to get the type for the CLSID: // // (IPiaType)System.Activator.CreateInstance(System.Type.GetTypeFromCLSID(new Guid(GUID))) CSharpSyntaxNode oldSyntax = _factory.Syntax; _factory.Syntax = node.Syntax; var ctor = _factory.WellKnownMethod(WellKnownMember.System_Guid__ctor); BoundExpression newGuid; if ((object)ctor != null) { newGuid = _factory.New(ctor, _factory.Literal(node.GuidString)); } else { newGuid = new BoundBadExpression(node.Syntax, LookupResultKind.NotCreatable, ImmutableArray <Symbol> .Empty, ImmutableArray <BoundNode> .Empty, ErrorTypeSymbol.UnknownResultType); } var getTypeFromCLSID = _factory.WellKnownMethod(WellKnownMember.System_Runtime_InteropServices_Marshal__GetTypeFromCLSID, isOptional: true); if ((object)getTypeFromCLSID == null) { getTypeFromCLSID = _factory.WellKnownMethod(WellKnownMember.System_Type__GetTypeFromCLSID); } BoundExpression callGetTypeFromCLSID; if ((object)getTypeFromCLSID != null) { callGetTypeFromCLSID = _factory.Call(null, getTypeFromCLSID, newGuid); } else { callGetTypeFromCLSID = new BoundBadExpression(node.Syntax, LookupResultKind.OverloadResolutionFailure, ImmutableArray <Symbol> .Empty, ImmutableArray <BoundNode> .Empty, ErrorTypeSymbol.UnknownResultType); } var createInstance = _factory.WellKnownMethod(WellKnownMember.System_Activator__CreateInstance); BoundExpression rewrittenObjectCreation; if ((object)createInstance != null) { rewrittenObjectCreation = _factory.Convert(node.Type, _factory.Call(null, createInstance, callGetTypeFromCLSID)); } else { rewrittenObjectCreation = new BoundBadExpression(node.Syntax, LookupResultKind.OverloadResolutionFailure, ImmutableArray <Symbol> .Empty, ImmutableArray <BoundNode> .Empty, node.Type); } _factory.Syntax = oldSyntax; if (node.InitializerExpressionOpt == null || node.InitializerExpressionOpt.HasErrors) { return(rewrittenObjectCreation); } return(MakeObjectCreationWithInitializer(node.Syntax, rewrittenObjectCreation, node.InitializerExpressionOpt, node.Type)); }