Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET本机工具链,用于可移植库中的UWP抛出NotImplementedException_C#_.net_Visual Studio_Uwp - Fatal编程技术网

C# NET本机工具链,用于可移植库中的UWP抛出NotImplementedException

C# NET本机工具链,用于可移植库中的UWP抛出NotImplementedException,c#,.net,visual-studio,uwp,C#,.net,Visual Studio,Uwp,我们有一个相当大的共享项目,可以说有3个项目负责人: Windows.UWP Windows.Desktop81 Windows.Phone81 这三个库分别引用了针对Windows 8.1和Windows Phone 8.1的便携式库 使用本机工具链编译UWP项目时,可移植库无法访问任何类型信息,因此无法执行任何反射 失败的方法是一种通用方法,它检查typeof(T)以根据类型执行各种操作 抛出系统的第一行。NotImplementedException是: If (typeof(T).I

我们有一个相当大的共享项目,可以说有3个项目负责人:

  • Windows.UWP
  • Windows.Desktop81
  • Windows.Phone81
这三个库分别引用了针对Windows 8.1和Windows Phone 8.1的便携式库

使用本机工具链编译UWP项目时,可移植库无法访问任何类型信息,因此无法执行任何反射

失败的方法是一种通用方法,它检查
typeof(T)
以根据类型执行各种操作

抛出
系统的第一行。NotImplementedException
是:

If (typeof(T).IsArray)
在本例中,T是
System.String
,如果我在失败的方法上中断调试器并在visual studio 2015的即时窗口中键入,我会得到:

>> typeof(string).IsArray
An internal error has occurred while evaluating method System.Type.get_IsArray().
但是,如果我在App.OnLaunched方法中也这样做,那么效果很好。因此,便携库无法访问任何类型信息,即使是像
system.String
这样的系统类型

我曾尝试为可移植库添加平台指令,但到目前为止没有成功


您是否有关于如何使便携库能够访问类型信息的任何信息。

Microsoft的Michal通过电子邮件回复了我,解释了根本原因和解决方法

您似乎遇到了此处描述的相同问题: ,但中的方法除外 问题是Type.IsArray,而不是ConstructorInfo.Invoke

问题是方法Type.IsArray被声明为非虚拟 在源代码编译的可移植库契约中 反对,但它在中使用时是虚拟的 .NET本机。这通常不是什么大问题,因为C# 编译器几乎总是使用“callvirt”指令来调用 方法(即使它不是虚拟的)。C#编译器以可视化的方式提供 Studio 2017开始进行优化,如果方法不可用 虚拟和传递给方法的“this”已知不为null, 它使用“call”而不是“callvirt”。结果是代码结束 调用一个不应该被调用的方法。结果 已知typeof()表达式从不为null

好消息是我们把IsArray作为 netstandard2.0的努力。坏消息是.NET本机支持 for NetStandard 2.0尚未发布

你需要一个变通办法。我能想到的最简单的方法就是添加一个 扩展方法,并改用该方法:

static class NetNativeWorkarounds
{
    public static bool IsArray(this Type type) => type.IsArray;
}
使用扩展方法可以避免C#编译器优化,因为 此条件不满足(编译器不知道您将使用哪种类型) 传递给扩展方法,并且必须对 Type.IsArray方法)