PlatformNotSupportedException Ninject Xamarin.iOS

时间:2018-02-15 20:01:25

标签: c# xamarin.ios ninject

我有一个使用Xamarin.iOS开发的iOS应用程序,它使用Ninject 3.3.0 for IoC。我可以毫无问题地绑定接口和实现,但我得到一个PlatformNotSupportedException来解析与IResolutionRoot.Get<T>()的绑定。我正在连接的Macbook上启动模拟器。我创建了一个测试(空白)iOS应用程序来演示该问题。以下是相关部分:

[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
  ...

  public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
  {
     ...

     var kernel = new StandardKernel();
     kernel.Bind<IFoo>().To<Foo>();

     var test = kernel.Get<IFoo>(); //exception thrown here

     return true;
  }
}

这里是堆栈跟踪的顶部(可以提供更多):

  

&#34;在System.Reflection.Emit.DynamicMethod..ctor(System.String名称,   System.Type returnType,System。...&#34;

根据this网站,内核为其绑定创建了这些DynamicMethod。由于.Net Standard 2.0的Ninject is supported,为什么我从这么简单的操作中得到这个例外?

1 个答案:

答案 0 :(得分:4)

更新:Portable.Ninject正常运行,因此如果您使用iOS,请使用它。以下是我如何到达那里以及为什么常规Ninject无法工作的解释。

System.Reflection.Emit is not supported。这可能意味着Ninject的大部分功能都不适用于iOS。

这些链接对我来说特别具有误导性:

https://developer.xamarin.com/api/type/System.Reflection.Emit.DynamicMethod/

现在已经了解了这个限制,很明显本文中提到的一代阻碍了Ninject的工作,尽管它没有明确说明。

http://arteksoftware.com/ioc-containers-with-xamarin/

这篇文章的作者提到了这个限制,虽然看起来他已经开始工作了。