在设备

时间:2017-08-18 20:06:50

标签: visual-studio xamarin xamarin.forms

我正在尝试在Xamarin.Forms项目中创建和使用DLL。这是在Charles Petzold的书“使用Xamarin.Form创建移动应用程序”中给出的。 它提供了以下方法来访问我创建的库

"从应用程序解决方案的PCL项目中,添加对库PCL程序集的引用,该程序集是从库项目生成的动态链接库"

我的图书馆项目是这个

FILE:HslColorExtension.cs

using System;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Xamarin.FormsBook.Toolkit
{
    public static class Toolkit
    {
        public static void Init()
        {
        }
    }

    public class HslColorExtension : IMarkupExtension
    {
        public HslColorExtension()
        {           
        }

        public double H { set; get; }
        public double S { set; get; }
        public double L { set; get; }
        public double A { set; get; }

        public object ProvideValue(IServiceProvider servicePRovider)
        {
            return Color.FromHsla(H, S, L, A);
        }
    }          
}

实际项目是CustomExtensionDemo 因为MainPage.xaml是

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit="clr-namespace:Xamarin.FormsBook.Toolkit;assemby=Xamarin.FormsBook.Toolkit"
             x:Class="CustomExtensionDemo.MainPage">
    <StackLayout>
        <Label Text="UTKARSH">
            <Label.BackgroundColor>
                <toolkit:HslColorExtension H="0" S="1" L="0.5"/>
            </Label.BackgroundColor>
        </Label>
    </StackLayout>
</ContentPage>

我如何将DLL添加到应用程序中的方法 从图书馆发现了生成DLL的路径 C:\用户\ ADMIN \桌面\ Xamarin.FormsBook.Toolkit \ Xamarin.FormsBook.Toolkit \ OBJ \调试 DLL的名称是 Xamarin.FormsBook.Toolkit.dll enter image description here

我添加了对实际项目的引用。浏览了一条路 C:\用户\ ADMIN \桌面\ Xamarin.FormsBook.Toolkit \ Xamarin.FormsBook.Toolkit \ OBJ \调试 并添加了DLL:Xamarin.FormsBook.Toolkit.dll enter image description here

所有内容都正确编译但我在Android手机上获得了完整的白屏。 要点:  的 1。我已将MainPage.xaml设置为App.xaml.cs中的MainPage。。我试图将Label放在没有属性元素语法的情况下,并且有效。

我还没有检查iOS我觉得它会遇到同样的问题,因为问题可能出在应用程序中使用DLL的方法中。 IDE:VS 2017

以下讨论中讨论的错误 enter image description here

现在我需要一些方法来移除&#34; Windows Phone Silverlight 8.1&#34;并且它没有提供删除选项。 enter image description here

2 个答案:

答案 0 :(得分:0)

我很确定你的问题是你的PCL目标不兼容。

不是通过浏览DLL添加引用,而是通过选择项目来添加它。此方法将检查DLL的兼容性。很可能你需要改变目标,愚弄nuget等等。

其次我建议你的第一个测试平台是UWP。在UWP上似乎有更好的诊断。当我尝试你的代码时,我在Android上获得了白屏,但是当使用UWP作为平台时,我得到了一个异常,表示在DLL中找不到HslColorExtension。

答案 1 :(得分:0)

如果您按照这些步骤操作,它应该适合您:

  1. 你错误地将汇编拼写为你的XAML中的“assemby”。
  2.     xmlns:toolkit="clr-namespace:Xamarin.FormsBook.Toolkit;assemby=Xamarin.FormsBook.Toolkit"
    
    1. 为了确保我们开始干净,让我们创建一个新的Xamarin.FormsBook.Toolkit项目并摆脱你一直在使用的项目:

      a)复制你已编写的代码,这样你就不会丢失它。

      b)创建一个新的Xamarin.FormsBook.Toolkit项目,并且仅针对那些你可以使用这个工具包的平台。例如,你永远不会在Silverlight中使用它,因为你将引用特定的IMarkupExtension Xamarin表格。

      c)从Xamarin Forms PCL项目中添加对Toolkit项目的引用(看起来你正在调用“CustomExtensionDemo”)。不要引用.dll而是引用项目本身。这将使您免于其他的麻烦。

      d)将您的HslColorExtension文件(以及您拥有的任何其他类)复制回新项目。

      e)将Xamarin.Forms Nuget包添加到您的Xamarin.FormsBook.Toolkit PCL,并在HslColorExtension文件的顶部添加“使用Xamarin.Forms”行,以便它识别IMarkupExtension接口。

      < / LI>
    2. 将一个空的Init函数(或任何你想要的函数)添加到你的HslColorExtension类,然后从你的App.xaml.cs中调用它。由于XAML是在运行时加载的,因此在XAML中有一个程序集引用这一事实会“唤醒编译器/链接器”。看起来似乎有点不自然,但是你可以在你的App.xaml.cs中丢掉那个丑陋的东西,你再也不用看了。如果你很好奇并希望看到发生了什么,请尝试在调用Init的情况下运行它,并查看Android项目的bin / Debug文件夹。当您调用Init时,您将看到您的Xamarin.FormsBook.Toolkit.dll出现在该文件夹中。如果你不打电话给Init,它就不会把你的组件拉进来。这是核心问题。

    3. 您生成的标记扩展代码如下所示:

          public class HslColorExtension : IMarkupExtension
          {
              public static void Init()
              {
              }
      
              public double H { set; get; }
              public double S { set; get; }
              public double L { set; get; }
              public double A { set; get; }
      
              public object ProvideValue(IServiceProvider serviceProvider)
              {
                  return Color.FromHsla(H, S, L, A);
              }
          }
      

      你的App.xaml.cs是这样的:

          public partial class App : Application
          {
              public App()
              {
                  HslColorExtension.Init();
      
                  InitializeComponent();
      
                  MainPage = new MainPage();
              }
              ...
          }
      

      如果这不能解决,请告诉我! : - )