我有一个Xamarin.iOS项目,该项目使用splat库https://github.com/paulcbetts/splat使System.Drawing类型在可移植类库中可用。如果父类使用(例如)System.Drawing.RectangleF,则通过使用Splat,可以很好地在Xamarin.IOS代码中对该类进行子类化。但是,Xamarin.Mac并非如此,至少不是我这样做的方式。各种类型彼此冲突-至少Point和RectangleF。

我不知道这是否与Xamarin的最新更新(对Xamarin 6的更新)有关。

下面是一些示例代码,我正在制作一个完整的项目,以演示Github上存在的问题。 https://github.com/verybadcat/splat-macbug分支。

它看起来类似于此处描述的问题[Splat [0.3.4] on Xamarin.iOS: issues with RectangleF and PointF

可移植类库项目:

using System.Drawing;
namespace PCL
{
  public class RectOwner
  {
    public RectangleF Rect { get; set;}
  }
}

IOS项目-可以正常工作:
using PCL;

namespace IOSApp
{
  public class RectOwnerIOS: RectOwner
  {
    public RectOwnerIOS ()
    {
      this.Rect = new System.Drawing.RectangleF (10, 20, 30, 40);
    }
  }
}

Mac项目-无法建立:
using PCL;


namespace MacApp
{
  public class RectOwnerSubclass: RectOwner
  {
    public RectOwnerSubclass ()
    {
      this.Rect = new System.Drawing.RectangleF (5, 6, 7, 8); // errors here:
      // /Users/william/Documents/splat/MacApp/RectOwnerMac.cs(16,16): Error CS7069: Reference to type `System.Drawing.RectangleF' claims it is defined assembly `Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null', but it could not be found (CS7069) (MacApp)
     // /Users/william/Documents/splat/MacApp/RectOwnerMac.cs(23,23): Error CS0029: Cannot implicitly convert type `System.Drawing.RectangleF [Xamarin.Mac, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065]' to `System.Drawing.RectangleF [Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null]' (CS0029) (MacApp)
    }
  }
}

我怎样才能建立Mac项目?

最佳答案

好的,所以所涉及的错误是:

RectOwnerMac.cs(11,12): error CS7069: Reference to type `System.Drawing.RectangleF' claims it is defined assembly `Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null', but it could not be found
RectOwnerMac.cs(11,19): error CS0029: Cannot implicitly convert type `System.Drawing.RectangleF [Xamarin.Mac, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065]' to `System.Drawing.RectangleF [Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null]'

这实际上是在说:“Splat声称声明了RectangleF,但我找不到它。哦,他们的东西和RectangleF与我找不到的东西不匹配。

如果您查看源代码,那是完全正确的。在Splat-portable中,他们声明了自己的RectangleF类,但是“诱饵和开关” Splat-XamarinMac没有一个类型转发器。

您可以通过以下方法解决此问题:将TypeForwardedSystemDrawing.cs添加到Split-XamarinMac项目中,进行重建(并注释掉或修复UIKit编译错误)。

随时与Splat团队讨论问题,以便最终解决此问题。

请注意,如果您尝试将Splat移植到XM 4.5目标框架,则需要引入OpenTK,因为出于各种遗留原因,在那里定义了SD类型:
$ monop -r:/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/mono/4.5/Xamarin.Mac.dll | grep Drawing.Rectangle
$ monop -r:/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/mono/4.5/OpenTK.dll | grep Drawing.Rectangle
System.Drawing.Rectangle
System.Drawing.RectangleF

关于c# - Splat库和Xamarin.Mac进行类型解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37880335/

10-10 20:32