将 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 应用程序
Zend Framework 2 使用 composer 自动加载第三方库