我有以下情况:
uap10.0.16299
)。有什么办法解决吗?还是我也必须构建X的UWP版本?到目前为止,我一直避免这样做的原因是,我将拥有一些只能在Windows上构建的目标,而另一些只能在Mac上构建的目标。
答案 0 :(得分:0)
并非必须以特定于平台的方式构建自定义.NetStd
程序集。您针对Xamarin.Essentials .NetStd参考程序集进行编译,然后针对与平台相关的Xamarin.Essentials程序集进行绑定,包括与平台相关的代码。
因此,在运行时,您的自定义.NetStd
程序集中的类型将被转发/调用到您的应用中已包含的Xamarin.Essentials
平台特定的程序集中。
因此,在包含.NetStd
的自定义Xamarin.Essentials
程序集中,将有一个外部程序集定义:
.assembly extern Xamarin.Essentials
{
.ver 1:0:0:0
}
然后在同一.NetStd
程序集中,您的代码将调用该程序集中存在的类型,即:OpenAppPackageFileAsync
IL_0030: call [System.Threading.Tasks]System.Threading.Tasks.Task`1<[System.IO]System.IO.Stream> [Xamarin.Essentials]Xamarin.Essentials.FileSystem::OpenAppPackageFileAsync(string)
注意:对于Essentials,它不使用DI / Interfaces来调用依赖于平台的代码,方法OpenAppPackageFileAsync
调用PlatformOpenAppPackageFileAsync
方法,而该方法将包括平台-每个平台相关程序集中的特定代码。在其基于.NetStd的参考Assembly方法中,它抛出NotImplementedInReferenceAssemblyException
,因为没有通用/通用基于.NetStd的框架代码实现加载只读应用程序捆绑的Android / iOS / UWP文件,即:>
.method private hidebysig static [System.Threading.Tasks]System.Threading.Tasks.Task`1<[System.IO]System.IO.Stream>
PlatformOpenAppPackageFileAsync(string filename) cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: newobj instance void Xamarin.Essentials.NotImplementedInReferenceAssemblyException::.ctor()
IL_0005: throw
} // end of method FileSystem::PlatformOpenAppPackageFileAsync
现在,当打包/捆绑依赖于平台的应用程序(例如在本例中为Android)时,您将不会处理/包括Essentials参考程序集,而是平台特定的版本。
Xamarin.Essentials.dll
程序集的Android版本为此PlatformOpenAppPackageFileAsync
方法提供了此功能:
.method private hidebysig static [mscorlib]System.Threading.Tasks.Task`1<[mscorlib]System.IO.Stream>
PlatformOpenAppPackageFileAsync(string filename) cil managed
{
// Code size 70 (0x46)
.maxstack 3
.locals init ([mscorlib]System.Threading.Tasks.Task`1<[mscorlib]System.IO.Stream> V_0,
[Mono.Android]Java.IO.FileNotFoundException V_1)
IL_0000: ldarg.0
IL_0001: brtrue.s IL_000e
~~~~
.try
{
IL_001d: call [Mono.Android]Android.Content.Context Xamarin.Essentials.Platform::get_AppContext()
IL_0022: callvirt instance [Mono.Android]Android.Content.Res.AssetManager [Mono.Android]Android.Content.Context::get_Assets()
IL_0027: ldarg.0
IL_0028: callvirt instance [mscorlib]System.IO.Stream [Mono.Android]Android.Content.Res.AssetManager::Open(string)
IL_002d: call [mscorlib]System.Threading.Tasks.Task`1<!!0> [mscorlib]System.Threading.Tasks.Task::FromResult<[mscorlib]System.IO.Stream>(!!0)
IL_0032: stloc.0
IL_0033: leave.s IL_0044
~~~