类型' System.Reflection.TargetException'的例外情况在Syncfusion.SfDataGrid

时间:2018-02-23 10:27:37

标签: datagrid xamarin.forms windows-10 syncfusion xamarin.uwp

我尝试使用SfDataGrid在Xamarin项目中使用paging(.net标准2.0作为包含视图的共享代码)。

Android项目在我的Motorola G4上的Android 7.1.2(LineageOS 14.1)下运行良好。

但是UWP项目崩溃了。在Visual Studio 2017的调试输出中,我看到以下异常:

Exception thrown: 'System.Reflection.TargetException' in System.Private.CoreLib.dll
System.Reflection.TargetException: Exception of type 'System.Reflection.TargetException' was thrown.
   at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException()
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Xamarin.Forms.ImageSource.FromResource(String resource, Assembly sourceAssembly)
   at Syncfusion.SfDataGrid.XForms.DataPager.AppearanceManager.GetFirstPageIcon()
   at Syncfusion.SfDataGrid.XForms.DataPager.Header.CreateHeaderContent()
   at Syncfusion.SfDataGrid.XForms.DataPager.Header..ctor(SfDataPager pager)
   at Syncfusion.SfDataGrid.XForms.DataPager.SfDataPager..ctor()
   at Foo.BarPage.InitializeComponent()
   at Foo.BarPage..ctor()

所有项目include the Nuget package。任何想法为什么失败?对于Android项目,我可以通过自定义Behavior类来设置Grid和Pager以及源,但是在UWP中我只看到这个异常,其中加载分页按钮的图标失败但行为代码从不被调用/调试永远不会在OnAttachedTo的断点处停止。

知道什么是错的或如何解决它?

//编辑2018-03-13

当我比较文件版本时,我看到适用于16.1451.0.26Syncfusion.SfDataGrid.XForms.Android.dll的Android版本Syncfusion.SfDataGrid.XForms.dll。但对于UWP来说,存在不匹配。 Syncfusion.SfDataGrid.XForms.UWP.dll版本为16.14 60 .0.26而Syncfusion.SfDataGrid.XForms.dll版本为16.1451.0.26。所以 60 51 不匹配的缝隙导致UWP下的问题,这可以解释为什么Android应用程序有效,因为这里的DLL具有相同的版本。

有没有人知道带有assemblyBinding的app.config是否仍在UWP中工作以解决此版本不匹配问题并强制将DLL与不同版本一起使用?

//编辑2018-04-04

我试图对它进行更多调查,获得Syncfusion Xamarin组件的源代码,修改它们以使用最新的Xamarin版本2.5.0.280555 Service Release 5并将项目直接添加到我的解决方案中,但我仍然得到相同的错误。

问题出现了directly when I follow the paging guide

  

创建一个新的SfDataPager实例

这会直接触发异常:

var appearanceManager = new CustomAppearance();
var dataPager = new SfDataPager
{
    AppearanceManager = appearanceManager
};

导致System.Reflection.TargetException

System.Reflection.TargetException: Exception of type 'System.Reflection.TargetException' was thrown.
   at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException()
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Xamarin.Forms.ImageSource.FromResource(String resource, Assembly sourceAssembly)
   at Syncfusion.SfDataGrid.XForms.DataPager.AppearanceManager.GetFirstPageIcon()
   at Syncfusion.SfDataGrid.XForms.DataPager.Header.CreateHeaderContent()
   at Syncfusion.SfDataGrid.XForms.DataPager.Header..ctor(SfDataPager pager)
   at Syncfusion.SfDataGrid.XForms.DataPager.SfDataPager..ctor()

但是在CustomAppearance类中我重写了GetIcons方法(GetFirstPageIcon,GetLastPageIcon,GetNextPageIcon,GetPreviousPageIcon)

public class CustomAppearance : AppearanceManager
{
    public override ImageSource GetFirstPageIcon()
    {
        var image = ImageSource.FromResource("App.Resources.FirstPageIcon.png");
        return image;
    }

    public override ImageSource GetLastPageIcon()
    {
        var image = ImageSource.FromResource("App.Resources.LastPageIcon.png");
        return image;
    }

    public override ImageSource GetNextPageIcon()
    {
        var image = ImageSource.FromResource("App.Resources.NextPageIcon.png");
        return image;
    }

    public override ImageSource GetPreviousPageIcon()
    {
        var image = ImageSource.FromResource("App.Resources.PrevPageIcon.png");
        return image;
    }
}

在Android中一切正常。在这里,我可以逐步完成所有覆盖并获取我的自定义图像,并在寻呼机中显示。在UWP项目中,我遇到了崩溃。

我也followed the steps which should be done in Release mode only,加载程序集:

List<Assembly> assembliesToInclude = new List<Assembly>();
//Now, add all the assemblies your app uses

assembliesToInclude.Add(typeof(SfDataGridRenderer).GetTypeInfo().Assembly);
assembliesToInclude.Add(typeof(SfDataPager).GetTypeInfo().Assembly);

Xamarin.Forms.DependencyService.Register<SfDataGridRenderer>();
Xamarin.Forms.DependencyService.Register<SfDataPager>();

// replaces Xamarin.Forms.Forms.Init(e);
Xamarin.Forms.Forms.Init(e, assembliesToInclude);

因此加载了Syncfusion.SfDataGrid.XForms.dllSyncfusion.SfDataGrid.XForms.UWP.dll DLL,但加载Syncfusion.SfDataGrid.XForms.dll的图片失败了:

enter image description here

我现在没有想法。

2 个答案:

答案 0 :(得分:1)

//编辑2018-07-23

问题最终在16.2.0.42中修复,他们现在添加了typeof(SfDataPager).GetTypeInfo().Assembly电话。








将Syncfusion.SfDataGrid.XForms的源代码添加到我的解决方案后,我在Syncfusion.SfDataGrid.XForms.DataPager.Header.CreateHeaderContent()设置了一个断点。这里创建了图像:

var image = new Image () {
    Source = this.Datapager.AppearanceManager.GetFirstPageIcon(),
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center,
};

这里调用GetFirstPageIcon()。所以我跳进了代码并看到了

public virtual ImageSource GetFirstPageIcon()
{
     return ImageSource.FromResource("Syncfusion.SfDataGrid.XForms.Resources.FirstPageIcon.png");
}

此处ImageSource.FromResource System.Reflection.TargetException被提出。所以调用ImageSource.FromResource失败了,因为它转化为:

 public virtual ImageSource GetFirstPageIcon()
 {
      return ImageSource.FromResource("Syncfusion.SfDataGrid.XForms.Resources.FirstPageIcon.png", null);
 }

第二个参数默认为null。这是加载图像的装配。

在UWP下,这会导致问题,可以通过将方法更改为

来修复
 public virtual ImageSource GetFirstPageIcon()
 {
      return ImageSource.FromResource("Syncfusion.SfDataGrid.XForms.Resources.FirstPageIcon.png", typeof(SfDataPager).GetTypeInfo().Assembly);
 }

现在Xamarin使用Syncfusion DLL加载资源而不是我的应用程序(不包含图像的.net标准共享代码库)。

Xamarin tracker / forum中的其他用户也发现了这一点,但是not documented by Microsoft

所以我必须等待Syncfusion的错误修正,他们会在typeof(SfDataPager).GetTypeInfo().Assembly更改所有方法以包含ImageSource.FromResource作为第二个参数。

答案 1 :(得分:0)

感谢您与Syncfusion支持小组联系。

当您的示例和SfDataGrid程序集之间存在Xamarin NuGet包不匹配时,通常会发生此错误。我们的16.1.0.24版本支持版本2.1的Xamarin NuGet。

Xamarin建议将NuGet包内联,以避免潜在的问题。因此,请卸载所有其他版本的NuGets并在PCL和示例的渲染器项目中使用2.1版本。还要确保在任何PCL和渲染器项目中都没有安装其他版本的Xamarin NuGets。在运行之前清理并重建项目。您可以从我们的自述信息中查看Syncfusion控件的软件要求。

自述文件链接: http://files2.syncfusion.com/Installs/v16.1.0.24/ReadMe/Xamarin_Forms.html

此致 素里亚