Open lhak opened 4 weeks ago
Does (AppServiceTriggerDetails)args.TaskInstance.TriggerDetails
work?
No, I get an InvalidCastException in this case.
Can you try to check if the type of TriggerDetails
is WinRT.IInspectable
?
Using GetType().FullName
indeed returns WinRT.IInspectable
when publishing the msix with AOT and AppServiceTriggerDetails
otherwise.
I've found the issue with the as
operator. Since C#/WinRT could not reason what the actual type is in AOT mode (since it doesn't support dynamic code), it fallbacks to the IDynamicInterfaceCastable
implementation. That implementation then checks the helper type of AppServiceTriggerDetails
, which it expects an interface. However, the helper type of AppServiceTriggerDetails
is a struct, not an interface, hence it fails.
I haven't managed to see why As<TInterface>()
works though, since from my initial look it seems to also be going through IDynamicInterfaceCastable
?
Given this is a class type with just an WinRT exclusive interface, there isn't any IDynamicInterfaceCastable
interface today. I assume As<>
works because it is making sure the type doesn't get trimmed whereas with just a cast, .NET is deciding it can trim it as it only seen it used with the cast especially given the API that it is returning this says it returns an Object
.
Description
This is related to https://github.com/microsoft/microsoft-ui-xaml/discussions/9983#discussioncomment-10708446
When publishing a UWP project using the preview .net 9 support with AOT, I noticed a crash when an appservice from a win32 helper tries to connect. It turns out that casting the argument (
args.TaskInstance.TriggerDetails
) in theBackgroundActivated(BackgroundActivatedEventArgs args)
activation method toAppServiceTriggerDetails
fails using the dotnetas
operator. However, it works usingargs.TaskInstance.TriggerDetails.As<AppServiceTriggerDetails>()
.Steps To Reproduce
A project that uses background activation through an appservice with a win32 helper is needed. The project also has to be published with AOT in release mode by creating an msix package (it sometimes worked in Debug configuration).
Expected Behavior
Casting using dotnet operator should work
Version Info
cswinrt 2.1.16 dotnet 9 rc2
Additional Context
No response