Xamarin ...迁移到 .NET Standard 2.0 失败

Xamarin ... migration to .NET Standard 2.0 failed

我正在尝试将我的 PCL 项目迁移到新的 "net standard" 但现在我失败了。

目前我遇到以下异常:

System.MissingMethodException: 'Method not found: 'Void Xamarin.Forms.Xaml.Internals.SimpleValueTargetProvider..ctor(System.Object[], System.Object, Xamarin.Forms.Internals.INameScope)'.'

它直接发生在我有以下 xaml 标签的页面的 'InitializeComponent' 中:

<Image Source="{ns_uc:ImageResource i_home_on.png}"/>

其中 'ImageResource' 是一个扩展标记,这个标记在我的 PCL 项目中非常有用。这是定义的一部分:

public class ImageResourceExtension : IMarkupExtension

但是这个 class 不是从我的新 .NET Standard 项目中调用的!

在 .csproj 中我有以下参考资料,应该足够了吧?

<PackageReference Include="System.ComponentModel" Version="4.3.0" />
<PackageReference Include="Xamarin.Forms" Version="3.4.0.1008975" />

所以,如果有人有想法,因为我已经在这个迁移中花了 2 天,但没有成功:-(

顺便说一句,看来我并不孤单:https://forums.xamarin.com/discussion/101999/cant-use-imarkupextension-in-a-net-standard-library

感谢您的帮助

1.System.ComponentModel 是某些 NetStandard versions.Try 中的 NuGet 包,如果不存在则安装它。

2.You可以直接使用<Image Source="myImage.png"/>,而不是在.net标准项目中使用IMarkupExtension

3.The ImageResourceExtension 的实现在 PCL 项目和 .net 标准 2.0 项目中可能有所不同。官方demo中有一个实现可以参考:

 [ContentProperty("Source")]
        class ImageResourceExtension : IMarkupExtension<ImageSource>
            {
                public string Source { set; get; }

                public ImageSource ProvideValue(IServiceProvider serviceProvider)
                {
                    if (String.IsNullOrEmpty(Source))
                    {
                        IXmlLineInfoProvider lineInfoProvider = serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider;
                        IXmlLineInfo lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
                        throw new XamlParseException("ImageResourceExtension requires Source property to be set", lineInfo);
                    }

                    string assemblyName = GetType().GetTypeInfo().Assembly.GetName().Name;
                    return ImageSource.FromResource(assemblyName + "." + Source, typeof(ImageResourceExtension).GetTypeInfo().Assembly);
                }

                object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
                {
                    return (this as IMarkupExtension<ImageSource>).ProvideValue(serviceProvider);
                }
            }

您可以参考下面的演示来修复您的项目。

参考:Demo of ImageResourceExtension

Documents of Markup Extensions

我会跟随 James Montemagno 的脚步:

https://montemagno.com/how-to-convert-a-pcl-library-to-net-standard-and-keep-git-history/

我关注了 Xamarin 节目中的这段视频: https://channel9.msdn.com/Shows/XamarinShow/Snack-Pack-15-Upgrading-to-XamarinForms-to-NET-Standard

我第一次自己试了一下,惨遭失败。第二次我完全按照视频中的说明进行操作,一切正常。