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

时间:2015-12-31 13:39:00

标签: c# .net windows-runtime uwp

有许多文章(codeprojectblog1blog2forum)可以将WinRT库用于Windows 8中的.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 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)
  4. 与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();
        }
    

    编译正常,控制台中显示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)并将复制本地设置为true,但所有引用都是如此,但同样的错误发生了。

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

2 个答案:

答案 0 :(得分:11)

以下是在此处工作的步骤,请注意您之间的细微差别:

第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.

中使用

答案 1 :(得分:1)

我遇到了这个错误,我从&#34; 5.0.0&#34;升级了Microsoft.NETCore.UniversalWindowsPlatform的版本。到&#34; 5.2.2&#34;我的程序开始工作