我正试图将我的PCL项目迁移到新的"网络标准",但目前我失败了。
目前我得到以下异常:
System.MissingMethodException: 'Method not found: 'Void Xamarin.Forms.Xaml.Internals.SimpleValueTargetProvider..ctor(System.Object[], System.Object, Xamarin.Forms.Internals.INameScope)'.'
它直接发生在页面的"InitializeComponent"中,我有以下xaml标记:
<Image Source="{ns_uc:ImageResource i_home_on.png}"/>
"ImageResource"是一个扩展标记,在我的PCL项目中,这个就像一个魅力。以下是定义的一部分:
public class ImageResourceExtension : IMarkupExtension
但是这个类不是从我的新.NET标准项目中调用的!
在.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版本中是一个NuGet包。如果它不存在,请尝试安装它。
2.您可以直接使用<Image Source="myImage.png"/>
,而不是在.net标准项目中使用IMarkupExtension
。
3.ImageResourceExtension
在PCL项目和.net标准2.0项目中的实现可能有所不同。这里有一个官方演示中的实现,你可以参考:
[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);
}
}
你可以参考下面的演示来修复你的项目。
参考:ImageResourceExtension 演示
标记扩展文档
我会遵循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
我第一次试了一下,结果失败得很惨。第二次转身时,我完全按照视频中的指示,一切都很顺利。