【问题标题】:Create a dll from a Windows 8.1 / Windows Phone 8.1 application with views and database从具有视图和数据库的 Windows 8.1 / Windows Phone 8.1 应用程序创建 dll
【发布时间】:2014-09-04 13:53:54
【问题描述】:

我正在创建一个 Windows Phone 8.1 应用程序,它应该充当其他 Windows Phone 8.1 应用程序的库。在我的新应用程序中,我可以将库项目添加到解决方案中,因此它可以作为一种外部库运行,这可以满足我的要求。
但是,我想知道是否有某种方法可以将我的 WP Library 应用程序导出到例如 .dll 中,我可以将其添加为对我的新应用程序的引用。有没有其他方法可以做到这一点?

值得一提的是,我的图书馆应用程序将有视图甚至数据库,而不仅仅是处理来自主应用程序的数据的方法。

【问题讨论】:

    标签: c# windows visual-studio dll windows-phone-8.1


    【解决方案1】:

    因为它是 Windows 8.1 / Windows Phone 8.1。你可以看看 Store Apps -> Universal Apps -> Class Library (Portable for Universal Apps)。


    编译成dll后,只需将对该dll的引用添加到引用文件夹即可。

    要在 C# 中使用您的库,只需输入您用于创建库的命名空间。

    using your_namespace_from_library;
    

    要使用您的视图以及不使用 XAML 的内容,只需在 XAML 文件中输入您的命名空间

    <Page xmlns:YOUR_AWESOME_TAG="using:your_namespace_from_library">
    

    然后您可以通过执行以下操作来使用库中的标签:

    <YOUR_AWESOME_TAG:Your_View>
    

    :)


    要解决有效负载问题,请查看错误消息,它应该类似于以下内容:

    仔细看。它试图引用一个不存在的目录来获取正确的文件。解决方案(我知道的唯一一个)是转到该目录并制作它。就我而言,它是“C:\Users\Duan\Documents\Visual Studio 2013\Projects\Chubosaurus.Charts_Old2\Chubosaurus.Charts\bin\Debug\Chubosaurus.Charts”

    出于某种原因,它决定在 DLL 编译到的 Debug 文件夹中创建一个额外的目录。因此,创建作为库名称的文件夹。这是你不喜欢的部分。将 Debug 文件夹的全部内容复制到刚刚创建的目录中(最重要的是 Theme 文件夹)。

    再次运行您的程序,您的问题将得到解决。 但不幸的是,每次编译该 dll 项目时都必须这样做。这就是为什么我说只需将库项目添加为解决方案的一部分,直到您准备好将其打包到 NuGet 中。希望对您有所帮助。


    一个简单的库(教程)

    假设我想制作一个用于图表调用的便携式库ChubCharts,我创建了项目,它为我加载了一个带有文件调用 Class1.cs 的默认便携式库

    我要做的第一件事就是删除那个文件:)

    然后我从 Add -> Add New Item -> Templated Control 中添加一个模板控件

    我将其命名为 ChubosaurusCharts,它在生成后应该看起来像这样。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Documents;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    
    public sealed class ChubosaurusCharts : Control
    {
        public ChubosaurusCharts()
        {
            this.DefaultStyleKey = typeof(ChubosaurusCharts);
        }
    }
    

    现在我拥有了有史以来最简单的控制。让我们应用一个 ContentTemplate 到它,这样我就可以把它变成一个复合控件,这样它就真的有事可做了:)

    Visual Studios 在解决方案中创建一个文件夹调用 Themes。该文件夹内有一个名为“Generic.xaml”的文件,其中包含我们的模板。

    现在我想编辑将放入自定义控件的内容

    Generic.xaml

    <Style TargetType="local:ChubosaurusCharts">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:ChubosaurusCharts">
                    <Border
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    默认情况下,它只是一个普通的旧 &lt;Border&gt; :(,我不想要那个。因为这是一个图表库。我想在可视化树中添加一些东西,主要是 &lt;Canvas&gt;,所以让我们将其更改为:

    <Style TargetType="local:ChubosaurusCharts">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:ChubosaurusCharts">
                    <Canvas Background="{TemplateBinding Background}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" DataContext="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}">
                        <ContentPresenter Content="{Binding Surface}"></ContentPresenter>
                    </Canvas>                    
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    到现在为止,您应该猜想您可以根据需要添加任意数量的 XAML 标记,以便正确显示您的控件。我只想要一个&lt;Canvas&gt;


    现在通过一点 DataBinding Magic,我将 Canvas 绑定到我的控件的画布上以便于访问 :)

    public sealed class ChubosaurusCharts : Control
    {
        public ChubosaurusCharts()
        {
            this.DefaultStyleKey = typeof(ChubosaurusCharts);
            this.Surface = new Canvas();
        }
    
        private Canvas surface;
    
        public Canvas Surface
        {
            get
            {
                return surface;
            }
            set
            {
                surface = value;
            }
        }
    }
    

    现在可以使用了:D

    将便携式库添加到您在命名空间中添加的解决方案中。编译。

    省略疯狂的小学代数和我的 RenderFunction(它只是在画布上添加线条)

    将我们的自定义控件添加到 MainPage.xaml,您现在也可以从工具箱中拖动控件:D

    <chubo:ChubosaurusCharts x:Name="my_chart">
    

    而你努力的结果是:

    干杯:D

    【讨论】:

    • 这确实编译为 .dll,但是当我在我的库中创建一个视图然后在我的应用程序中调用时,如下所示:Page page = ClassLibraryTest.Class1.GetPage(); 我收到错误:“有效负载文件”不存在”。我发现这个answer 虽然很旧,但似乎是合理的。您对此有什么建议吗?
    • 是的,我有解决这个问题的方法(但你不会喜欢它)。如果您还没有准备好打包 dll 文件,那么最好将类库也添加到解决方案中。然后你可以通过项目引用它。有很多关于如何将 dll 文件打包到 NuGet 等的网络文章。
    • 好的,你的意思是我可以将我的类库与视图和数据库编译成一个nuget包?
    • 我想我是对的。也许有更多经验的人可以给你一个明确的答案。我为您的有效负载问题更新了我的解决方案,但我仍然建议您将其添加为解决方案的一部分。同时打开 2 个视觉工作室真是太糟糕了。
    • 我从没想过那样做。我一直认为您制作了 Class MyTag : Control 并从那里为所述控件设置了 &lt;ControlTemplate&gt; 的样式。里面是你放置常规 XAML 标记的地方,这些标记构成了你的视图。这样,任何使用您的库的人都可以覆盖您的控件模板,就像您可以使用 ListBox、ListView 等一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2015-09-18
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多