public InteropSignatureTransform(GlobalNamespaceProvider provider, Logger logger) { this.provider = provider; this.logger = logger; returnTypeOverrides = new Dictionary <string, SignatureInteropTypeOverride> { { provider.GetTypeName(WellKnownName.Result), TypeRegistry.Int32 }, { provider.GetTypeName(WellKnownName.PointerSize), TypeRegistry.VoidPtr } }; const InteropMethodSignatureFlags castToNativeLong = InteropMethodSignatureFlags.CastToNativeLong; const InteropMethodSignatureFlags castToNativeULong = InteropMethodSignatureFlags.CastToNativeULong; windowsOnlyReturnTypeOverrides = new Dictionary <string, SignatureInteropTypeOverride> { { provider.GetTypeName(WellKnownName.NativeLong), new SignatureInteropTypeOverride(TypeRegistry.Int32, castToNativeLong) }, { provider.GetTypeName(WellKnownName.NativeULong), new SignatureInteropTypeOverride(TypeRegistry.UInt32, castToNativeULong) } }; systemvOnlyReturnTypeOverrides = new Dictionary <string, SignatureInteropTypeOverride> { { provider.GetTypeName(WellKnownName.NativeLong), new SignatureInteropTypeOverride(TypeRegistry.IntPtr, castToNativeLong) }, { provider.GetTypeName(WellKnownName.NativeULong), new SignatureInteropTypeOverride(TypeRegistry.UIntPtr, castToNativeULong) } }; }
private InteropType GetInteropTypeForReturnValue(CsReturnValue returnValue, PlatformDetectionType platform, ref InteropMethodSignatureFlags flags) { var platformSpecificReturnTypeOverrides = (platform & PlatformDetectionType.Windows) != 0 ? windowsOnlyReturnTypeOverrides : systemvOnlyReturnTypeOverrides; // Handle Return Type parameter // MarshalType.Type == null, then check that it is a structure if (returnValue.PublicType is CsStruct or CsEnum) { var returnQualifiedName = returnValue.PublicType.QualifiedName; if (returnTypeOverrides.TryGetValue(returnQualifiedName, out var interopType)) { flags |= interopType.SetFlags; return(interopType.NewType); } if (platformSpecificReturnTypeOverrides.TryGetValue(returnQualifiedName, out interopType)) { flags |= interopType.SetFlags; return(interopType.NewType); } return(returnValue.HasNativeValueType ? $"{returnValue.MarshalType.QualifiedName}.__Native" : returnValue.MarshalType.QualifiedName); } if (returnValue.MarshalType is CsFundamentalType fundamentalReturn) { return(fundamentalReturn); } if (returnValue.HasPointer) { return(returnValue.IsInterface ? TypeRegistry.IntPtr : TypeRegistry.VoidPtr); } return(null); }
public InteropSignatureTransform(Ioc ioc) { this.ioc = ioc ?? throw new ArgumentNullException(nameof(ioc)); returnTypeOverrides = new Dictionary <string, SignatureInteropTypeOverride> { { Provider.GetTypeName(WellKnownName.Result), TypeRegistry.Int32 }, { Provider.GetTypeName(WellKnownName.PointerSize), TypeRegistry.VoidPtr } }; const InteropMethodSignatureFlags castToNativeLong = InteropMethodSignatureFlags.CastToNativeLong; const InteropMethodSignatureFlags castToNativeULong = InteropMethodSignatureFlags.CastToNativeULong; windowsOnlyReturnTypeOverrides = new Dictionary <string, SignatureInteropTypeOverride> { { Provider.GetTypeName(WellKnownName.NativeLong), new SignatureInteropTypeOverride(TypeRegistry.Int32, castToNativeLong) }, { Provider.GetTypeName(WellKnownName.NativeULong), new SignatureInteropTypeOverride(TypeRegistry.UInt32, castToNativeULong) } }; systemvOnlyReturnTypeOverrides = new Dictionary <string, SignatureInteropTypeOverride> { { Provider.GetTypeName(WellKnownName.NativeLong), new SignatureInteropTypeOverride(TypeRegistry.IntPtr, castToNativeLong) }, { Provider.GetTypeName(WellKnownName.NativeULong), new SignatureInteropTypeOverride(TypeRegistry.UIntPtr, castToNativeULong) } }; }
private void InitSignatureWithReturnType(CsCallable callable, InteropMethodSignature cSharpInteropCalliSignature, PlatformDetectionType platform) { InteropMethodSignatureFlags flags = default; var returnType = GetInteropTypeForReturnValue(callable.ReturnValue, platform, ref flags); if (returnType == null) { logger.Error(LoggingCodes.InvalidMethodReturnType, "Invalid return type {0} for method {1}", callable.ReturnValue.PublicType.QualifiedName, callable.CppElement); returnType = callable.ReturnValue.PublicType.QualifiedName; } if (flags != default) { cSharpInteropCalliSignature.Flags |= flags; } cSharpInteropCalliSignature.ReturnType = returnType; }