【问题标题】:Why UWP app can not use PCL that references classic .Net dll?为什么 UWP 应用程序不能使用引用经典 .Net dll 的 PCL?
【发布时间】:2018-03-24 02:30:48
【问题描述】:

我们收集了大量的经典 .Net 库,这些库使用从 .Net 3.5 到 4.6 的任何版本编写而成。这包括我们在使用 WCF、Web API、Asp.Net、WPF 和 Windows 窗体的各种 .Net 解决方案中使用的核心业务逻辑和数据模型类。因此,在考虑创建 UWP 应用时,我们需要重用其中一些 .Net dll,这是很自然的。

我创建了一个可移植类库 (PCL),我在其中引用了我们的一个 .Net 4.5 dll。然后我在 PCL 中创建了一个实现 4.5 类之一的类:

using DODServiceLib.Models;

namespace PortableClassLibrary
{
    public class UtilityStats : ProcessorStats
    {
    }
}

ProcessorStats 来自 4.5 dll,DODServiceLib.Models。

在我的 UWP 应用程序中,我添加了对 PCL、PortableClassLibrary 的项目引用,并在后面的代码中添加了一条 using 语句,这是我需要使用我的 .Net 类实现的地方:

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Net.Http;
using System.Threading.Tasks;
using PortableClassLibrary;

namespace HelloWorld
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            var utilityStats = new UtilityStats();
        }
    }
}

在构建解决方案时,我在 UWP HelloWorld 应用程序中遇到以下错误:

Type universe cannot resolve assembly: DODServiceLib, Version=20.17.7.28, Culture=neutral, PublicKeyToken=null.
Cannot resolve Assembly or Windows Metadata file 'DODServiceLib.dll'

当 UWP 应用仅使用 PCL 时,为什么要寻找对 .Net DLL (DODServiceLib) 的引用?

我不能将这样的 PCL 用作经典 .Net 库的“包装器”吗?

【问题讨论】:

    标签: .net uwp portable-class-library


    【解决方案1】:

    当 UWP 应用仅使用 PCL 时,为什么要寻找对 .Net DLL (DODServiceLib) 的引用?

    这很正常。您的 PCL 添加了对该 .NET DLL 的附加引用,因此它肯定会查找该 dll。但是 UWP 不支持这个 dll。这就是为什么你会得到例外的原因。 UWP 项目可以引用通用 Windows 类库、可移植库或 Windows 运行时组件。这并不意味着您可以使用 PCL 来包装经典的 .NET 库。那是完全不同的事情。我认为您需要做的是将所有代码从 .NET 库复制到 PCL 中,然后开始消除/替换所有不适合的代码。

    【讨论】:

    • 问题是我的 .Net 库使用实体框架连接到 SQL Server 数据库,我无法让 EF 在 PCL 中工作。我可以通过 Nuget 将 EF 添加到 PCL,但是在 add-new-items 下没有可用的实体数据模型类。然后发现另一篇文章指出 PCL 不支持 System.Data,因此我认为 PCL 毫无用处,至少就数据访问而言。
    • Windows 10 Fall Creators Update (build 16299) UWP 应用现在可以通过标准 NET 类 (System.Data.SqlClient) 直接访问 SQL Server,因此,您可以使用这些 API 来制作自己的PCL 中的 sql 助手类。有关详细信息,请参阅此thread
    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2012-09-20
    相关资源
    最近更新 更多