【发布时间】:2015-06-30 00:42:50
【问题描述】:
自 Visual Studio 2013 Update 2 起,可以创建可引用 Windows 运行时类型(以前不可能)的可移植类库 (PCL),只要它们仅针对 Windows 8.1 和Windows Phone 8.1,没有其他目标。
我在 C# 中通过添加 C#类库(通用应用程序的可移植) 进行了尝试,它可以工作,这意味着您可以使用和生成 Windows 运行时类型如果项目是 Windows 应用程序 或 Windows 运行时组件。
由于 F# 也支持 PCL,并且 Windows 8.1 和 Windows Phone 8.1 是受支持的目标,因此我希望使用 F# PCL 实现相同的目标(如果可能的话)。虽然 Visual Studio 2013 Update 4 不提供创建仅针对 Windows 8.1 和 Windows Phone 8.1 的 F# PCL,但可以将 F# PCL 的 .fsproj 文件修改为将 C# PCL 的 .csproj 文件与使用 Visual Studio 创建的目标匹配。这需要将 XML 元素更改为以下内容:
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile32</TargetFrameworkProfile>
并将以下内容添加到<ItemGroup>
<TargetPlatform Include="WindowsPhoneApp, Version=8.1" />
<TargetPlatform Include="Windows, Version=8.1" />
在这些更改之后,我能够像在 C# PCL 中一样在 F# PCL 中使用和生成 Windows 运行时类型(没有来自 F# PCL 或 C#(通用)中的 Visual Studio 的抱怨Windows 应用程序),但是当我实际运行(通用)Windows 应用程序时,当在 F# PCL 中从 C#(通用)Windows 应用程序:
“System.IO.FileNotFoundException”类型的异常发生在 [应用程序名称].exe 但未在用户代码中处理
附加信息:无法加载文件或程序集“Windows,版本=255.255.255.255,文化=中性,PublicKeyToken=null”或一个 其依赖项。系统找不到指定的文件。
当我在 Visual Studio 的解决方案资源管理器中检查引用时,C# PCL 显示一个名为 Windows 的引用,而 F# PCL 中缺少该引用。该引用的引用属性如下所示:
我尝试通过添加手动将此引用添加到 F# PCL 的 .fsproj 文件中
<Reference Include="C:\Program Files (x86)\Microsoft SDKs\Portable\v12.0\110C4FEFF2BA61C0746933A9ED6E248D\Windows.winmd" />
到<ItemGroup>。在此之后,参考确实显示在解决方案资源管理器的 F# PCL 中,并具有以下参考属性:
但不能解决问题。也就是说,我仍然得到与以前相同的异常。
我还尝试通过 Visual Studio 解决方案资源管理器的上下文菜单复制和粘贴 Windows 引用,但它抱怨错误消息。
您知道如何正确地将 Windows 引用添加到 F# PCL 中吗?这真是太棒了,因为这样就可以几乎完全用 F# 编写(通用)Windows 应用程序!如果您知道这是不可能的,那么您能否解释一下是什么阻止了这成为可能?
编辑:改进了异常消息的格式
【问题讨论】:
-
有什么更新吗?我还希望 F# 库支持我的 Windows 10 通用应用程序。
标签: f# msbuild windows-runtime win-universal-app