自从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元素更改为以下内容:
经过这些更改,我能够在 F# PCL 中像在 C# PCL 中一样使用和生产 Windows 运行时类型(在 F# PCL 或 C#(通用)Windows 应用程序中没有任何投诉),但是当我实际运行(通用)Windows 应用程序时,当从 C#(通用)Windows 应用程序中调用使用 Windows 运行时类型的函数时,我会遇到以下异常:
将其添加到
我在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 中缺少此引用。该引用的引用属性如下所示:
我尝试通过在 .fsproj 文件中手动添加此引用来解决问题。
<Reference Include="C:\Program Files (x86)\Microsoft SDKs\Portable\v12.0\110C4FEFF2BA61C0746933A9ED6E248D\Windows.winmd" />
将其添加到
<ItemGroup>
中。此后,在解决方案资源管理器中,引用将出现在 F# PCL 中,具有以下参考属性:
但这并不能解决问题。也就是说,我仍然会得到与之前相同的异常。
我还尝试了通过 Visual Studio 的解决方案资源管理器上下文菜单复制和粘贴 Windows 引用,但它会显示错误消息。
您知道如何正确添加 Windows 引用到 F# PCL 吗?如果可以的话,这将非常棒,因为这将使编写 (通用) Windows 应用程序 几乎完全使用 F# 成为可能!如果您确信这是不可能的,请解释一下是什么原因导致这不可能成为可能。
编辑:改进了异常消息的格式