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);
}
}
您可以参考下面的演示来修复您的项目。
我会跟随 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
我第一次自己试了一下,惨遭失败。第二次我完全按照视频中的说明进行操作,一切正常。
我正在尝试将我的 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);
}
}
您可以参考下面的演示来修复您的项目。
我会跟随 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
我第一次自己试了一下,惨遭失败。第二次我完全按照视频中的说明进行操作,一切正常。