Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
visualstudio(Xamarin):DependencyService+;Nuget+;iOS=失败_Ios_Visual Studio_Xamarin - Fatal编程技术网

visualstudio(Xamarin):DependencyService+;Nuget+;iOS=失败

visualstudio(Xamarin):DependencyService+;Nuget+;iOS=失败,ios,visual-studio,xamarin,Ios,Visual Studio,Xamarin,我们正在编写一个Visual Studio(Xamarin)跨平台应用程序,该应用程序将与我们编写的下一个应用程序共享相当多的功能,因此我们希望将该共享功能放入一个“库”,以便我们可以测试它,轻松地共享它,等等 我们发现编写跨平台库的唯一方法是使用标准的Xamarin DependencyService范例创建库,将其转换为NuGet包,然后将该包加载到我们的主应用程序中。不管是好是坏,我们在微软提供生成NuGet库的模板之前就这样做了,所以我们不得不自己动手 这对Android来说很好,但现在

我们正在编写一个Visual Studio(Xamarin)跨平台应用程序,该应用程序将与我们编写的下一个应用程序共享相当多的功能,因此我们希望将该共享功能放入一个“库”,以便我们可以测试它,轻松地共享它,等等

我们发现编写跨平台库的唯一方法是使用标准的Xamarin DependencyService范例创建库,将其转换为NuGet包,然后将该包加载到我们的主应用程序中。不管是好是坏,我们在微软提供生成NuGet库的模板之前就这样做了,所以我们不得不自己动手

这对Android来说很好,但现在我想让同样的代码在iOS上运行,但它根本不起作用。没有错误,没有警告,但是当我运行应用程序并调用

Client = DependencyService.Get<IClient>();
使用DLL的应用程序具有以下iOS项目设置:

SDK Version: Default
Linker Behavior: Don't Link
Platform: Active (iPhone)
Supported Architectures: ARMv7 + ARM64
Target framework: Xamarin.IOS
Output type: Console Application
Conditional compilation symbols: __ UNIFIED__;__ MOBILE__;__ IOS__
我的“抽象”项目中的接口定义如下所示:

namespace Company.Client
{
    public abstract class IClient
    {
        void abstract function();
    }
}
using Company.Client.iOS;

[assembly: Xamarin.Forms.Dependency (typeof (IosClient))]
namespace Company.Client.iOS
{
    public class IosClient : IClient
    {
        void override function();
    }
}
我的iOS项目中的实现如下所示:

namespace Company.Client
{
    public abstract class IClient
    {
        void abstract function();
    }
}
using Company.Client.iOS;

[assembly: Xamarin.Forms.Dependency (typeof (IosClient))]
namespace Company.Client.iOS
{
    public class IosClient : IClient
    {
        void override function();
    }
}

我们尝试了许多不同的方法来创建一个NuGet包,使用DependencyService加载特定于平台的代码,每种方法都有相同的问题——在Android下工作正常,在iOS下失败


解决方案是在iOS库中创建一个未使用DependencyService加载的类,然后在iOS应用程序中创建该类的实例。这足以让iOS应用程序确信它实际上需要加载iOS库DLL,然后DependencyService的其余部分就可以正常工作了。

我们尝试了许多不同的方法来创建一个NuGet包,使用DependencyService加载特定于平台的代码,每种方法都有相同的问题——在Android下工作正常,在iOS下失败


解决方案是在iOS库中创建一个未使用DependencyService加载的类,然后在iOS应用程序中创建该类的实例。这足以让iOS应用程序确信它实际上需要加载iOS库DLL,然后DependencyService魔术的其余部分才能正常工作。

实现DS接口的iOS程序集是否包含
[assembly:Xamarin.Forms.Dependency(typeof…
attribute?是的,我已经更新了我的原始帖子,将其包括在内。很好。你有没有针对iOS的解决方案?我们还尝试在特定于Nuget的平台中打包依赖关系服务实现,并尝试使用另一个解决方案的PCL访问该实现,但我们的应用程序崩溃,因为它无法解决依赖关系。当我在其他解决方案的平台代码中而不是Nuget中实现依赖关系时,它就起作用了。批准的答案(下面)对我们来说很有效。我们必须对每个iOS库都这样做。实现DS接口的iOS程序集是否包含
[assembly:Xamarin.Forms.dependency(typeof…
attribute?是的,我已经更新了我的原始帖子,将其包括在内。很好。你有没有针对iOS的解决方案?我们还尝试在特定于Nuget的平台中打包依赖关系服务实现,并尝试使用另一个解决方案的PCL访问该实现,但我们的应用程序崩溃,因为它无法解决依赖关系。当我在其他解决方案的平台代码中实现依赖项而不是Nuget时,它就起作用了。批准的答案(下面)对我们很有效。我们必须对每个iOS库都这样做。