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

本文关键字:Framework 应用程序 NET UWP 加载 | 更新日期: 2023-09-27 18:28:45

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

我在Windows 10中用UWP尝试过。但没能成功。我努力编译,没有出错,但在运行时出现了BadImageFormatException

这就是我所做的。

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

与Windows8示例相反,引用System.Runtime.dll时会出现错误。

代码如下。请注意,代码来自Microsoft论坛。

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();
    }

编译正常,控制台显示not null。所以,调用库本身似乎很好。但CCD_ 5引起CCD_ 6。

异常消息的详细信息如下。

引发异常:mscorlib.dll 中的"System.BadImageFormatException"

其他信息:无法加载文件或程序集"System.Runtime.WindowsRuntime,版本=4.0.10.0,区域性=中性,PublicKeyToken=b77a5c561934e089"或其依赖项之一。不应加载引用程序集以执行。它们只能在"仅反射"加载程序上下文中加载。(HRESULT异常:0x80131058)

我已经尝试(1)将生成配置更改为x86/x64/AnyCPU(2),并将所有引用的复制本地设置为true,但发生了相同的错误。

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

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

以下是在这里工作的步骤,请注意您的步骤之间的细微差异:

步骤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)

它在桌面中不可用,桌面中只支持此处引用的类型。

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