将 UWP 库加载到 .NET Framework 应用程序中

Posted

技术标签:

【中文标题】将 UWP 库加载到 .NET Framework 应用程序中【英文标题】:Load UWP library into .NET Framework app 【发布时间】:2016-04-05 11:26:01 【问题描述】:

有许多文章(codeproject、blog1、blog2、forum)在 Windows 8 中将 WinRT 库用于 .Net Framework 控制台应用程序。

我在 Windows 10 中使用 UWP 进行了尝试。但未能成功。我努力编译没有错误,但它发生在运行时BadImageFormatException

这就是我所做的。

    使用 .NET Framework 4.6.1 目标创建控制台应用程序。 编辑 .csproj 文件以添加 <TargetPlatformVersion>10.0</TargetPlatformVersion> 参考以下三个库。 c:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd(显示 Windows 运行时 1.4) c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5.1\System.Runtime.WindowsRuntime.dll(显示 4.0.10.0) c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5.1\System.Runtime.InteropServices.WindowsRuntime.dll(显示 4.0.0.0)

与 Windows 8 示例相反,引用 System.Runtime.dll 时会出错。

代码如下。注意代码来自Microsoft forum。

class Program

    static void Main(string[] args)
    

        Geolocator locator = new Geolocator();
        var status = Geolocator.RequestAccessAsync();

        if (status != null)
        
            Console.WriteLine("not null");
            Task.Run(async () =>
            
                Geoposition pos = await locator.GetGeopositionAsync();
                Console.WriteLine(pos.Coordinate.Accuracy);
            );
        
        else
        
            Console.WriteLine("null");
        
        Console.ReadLine();
    

编译OK,控制台显示not null。因此,调用库本身似乎很好。但是GetGeopositionAsync 导致BadImageFormatException

异常信息详情如下。

抛出异常:mscorlib.dll 中的“System.BadImageFormatException”

其他信息:无法加载文件或程序集“System.Runtime.WindowsRuntime, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或其依赖项之一。不应加载引用程序集以供执行。它们只能在 Reflection-only loader 上下文中加载。 (HRESULT 异常:0x80131058)

我已经尝试 (1) 将构建配置更改为 x86/x64/AnyCPU (2) 并将所有引用的 Copy Local 设置为 true,但同样的错误发生了。

在我看来,这个异常是说 System.Runtime.WindowsRuntime 试图在内部加载一些依赖库,但我不知道它是什么。

【问题讨论】:

您无法执行引用程序集。将它们的 Copy Local 属性设置为 False 并使用 Build > Clean。按 F5,现在您看到了真正的问题,您的机器上没有这些程序集的 4.0.10.0 版本。 DLL Hell 敲你的门,这当然不稀奇。应该从 Nuget 中检索,但这也不起作用,错误的项目风格。在我的机器上使用 4.5 中的参考程序集可以正常工作。 @HansPassant // 谢谢,然后是回答和您的评论,我将 Copy Local 更改为 false 并且 Clean 项目使其工作。 【参考方案1】:

这里是这里的工作步骤,注意你们之间的细微差别:

第 1 步:添加到 .csproj 文件

  <PropertyGroup>
    <TargetPlatformVersion>10.0</TargetPlatformVersion>
  </PropertyGroup>

第 2 步:添加对

的引用
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd

第 3 步:添加对

的引用
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

注意区别,v4.5 而不是 v4.5.1,并且没有引用 System.Runtime.InteropServices.WindowsRuntime.dll

这在这里工作正常(Win10,VS2015)。

旁注,无论如何调用 Geolocator 都会失败:

This operation is only valid in the context of an app container. (Exception from HRESULT: 0x8007109A)

它不能在桌面内使用,only types referenced here are supported in desktop.

【讨论】:

【参考方案2】:

我遇到了这个错误,我将 Microsoft.NETCore.UniversalWindowsPlatform 的版本从“5.0.0”升级到“5.2.2”,我的程序开始运行

【讨论】:

以上是关于将 UWP 库加载到 .NET Framework 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

将所有依赖项从 .Net 标准库复制到 .Net Framework Console 应用程序

iOS库 .a与.framework区别

Zend Framework 2 使用 composer 自动加载第三方库

使用 .Net 标准库中的 UWP 方法

UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

.Net Framework认知