为通用应用程序(又称商店应用程序或Windows应用程序或WinRT应用程序)创建F# PCL

7
自从Visual Studio 2013 Update 2以来,可以创建便携式类库(PCLs),这些类库可以引用Windows Runtime类型(此前不可能),只要它们仅针对Windows 8.1和Windows Phone 8.1,并且没有其他目标。
我在C#中尝试了这个功能,通过添加一个C#“Class Library(Portable for Universal Apps)”,它可以工作,这意味着您可以像Windows应用程序或Windows Runtime组件一样消耗和生成Windows Runtime类型。
由于F#也支持PCLs,而且Windows 8.1和Windows Phone 8.1是受支持的目标,因此如果可能,我想使用F# PCLs实现相同的功能。虽然Visual Studio 2013 Update 4不提供仅针对Windows 8.1和Windows Phone 8.1创建F# PCLs的选项,但是可以修改F# PCL的.fsproj文件以匹配使用Visual Studio创建的具有这些目标的C# PCL的.csproj文件。这需要将XML元素更改为以下内容:
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile32</TargetFrameworkProfile>

并将以下内容添加到<ItemGroup>中:

<TargetPlatform Include="WindowsPhoneApp, Version=8.1" />
<TargetPlatform Include="Windows, Version=8.1" />

经过这些更改,我能够在 F# PCL 中像在 C# PCL 中一样使用和生产 Windows 运行时类型(在 F# PCL 或 C#(通用)Windows 应用程序中没有任何投诉),但是当我实际运行(通用)Windows 应用程序时,当从 C#(通用)Windows 应用程序中调用使用 Windows 运行时类型的函数时,我会遇到以下异常:

System.IO.FileNotFoundException 类型的异常发生在 [应用程序名称].exe 中,但未在用户代码中处理

其他信息:无法加载文件或程序集“Windows,Version=255.255.255.255,Culture=neutral,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。

当我检查 Visual Studio 的解决方案资源管理器中的引用时,C# PCL 显示一个名为 Windows 的引用,而 F# PCL 中缺少此引用。该引用的引用属性如下所示:

properties of Windows reference

我尝试通过在 .fsproj 文件中手动添加此引用来解决问题。

<Reference Include="C:\Program Files (x86)\Microsoft SDKs\Portable\v12.0\110C4FEFF2BA61C0746933A9ED6E248D\Windows.winmd" />

将其添加到 <ItemGroup> 中。此后,在解决方案资源管理器中,引用将出现在 F# PCL 中,具有以下参考属性:

enter image description here

但这并不能解决问题。也就是说,我仍然会得到与之前相同的异常。

我还尝试了通过 Visual Studio 的解决方案资源管理器上下文菜单复制和粘贴 Windows 引用,但它会显示错误消息。

您知道如何正确添加 Windows 引用到 F# PCL 吗?如果可以的话,这将非常棒,因为这将使编写 (通用) Windows 应用程序 几乎完全使用 F# 成为可能!如果您确信这是不可能的,请解释一下是什么原因导致这不可能成为可能。

编辑:改进了异常消息的格式


有更新吗?我也想要支持我的Windows 10通用应用程序的F#库。 - Scott Nimrod
1个回答

1

你正在制作一个 可移植 类库。F# 不支持 Windows 应用商店应用,因此在这种情况下使用 F# 的唯一方法是从 C# 中调用它。如果你成功了,你将成为第一个成功的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接