我有一个Uno平台应用程序,基于。net 5在WebAssembly上构建。
我有一个库,每次点击Toast Notification时构造一个ToastNotificationActivatedEventArgs
,并调用Application.Current
的OnActivated
方法。由于某些原因,类没有可见的构造函数,无论是通过代码还是通过反射(GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Count()
返回0),尽管这里声明了一个。
所以我使用FormatterServices.GetUninitializedObject
创建对象,并使用反射初始化每个字段。然而,在那之后,奇怪的事情开始发生。
protected override void OnActivated(IActivatedEventArgs e)
{
// Prints True.
Console.WriteLine(e.GetType() == typeof(ToastNotificationActivatedEventArgs));
// Gives a valid object.
var obj1 = (ToastNotificationActivatedEventArgs)e;
// Prints False.
Console.WriteLine(e is ToastNotificationActivatedEventArgs);
// Gives null
var obj2 = e as ToastNotificationActivatedEventArgs;
}
我怀疑FormatterServices.GetUnitializedObject
一定做了一些不好的事情,但是当我试图用正常的。net 5复制时,什么也没有发生。正常解析类型
我哪里做错了?我知道滥用反射和使用FormatterServices
来做反序列化以外的事情并不好,但这是我所知道的唯一方法,因为我必须触摸一些内部函数来从外部库复制UWP中的行为。
这是由链接器删除未使用的内部构造函数以减小生成的程序集大小引起的。您可以通过在WASM项目的LinkerConfig.xml
文件中添加以下内容来防止这种情况:
<assembly fullname="Uno">
<type fullname="Windows.ApplicationModel.Activation.ToastNotificationActivatedEventArgs" />
</assembly>
现在可以确认构造函数可用了:
var constructors = typeof(ToastNotificationActivatedEventArgs).GetConstructors(
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine(constructors.Length);