自Visual Studio 2013 Update 2以来,可以创建可引用Windows运行时类型的可移植类库(这在以前是不可能的),只要它们只针对Windows 8.1和Windows Phone 8.1,而不针对其他目标。
我在C#中通过添加一个C#类库(可移植到通用应用程序)尝试了这一点,并且它可以工作,这意味着您可以使用和生成Windows运行时类型,就像项目是一个Windows应用程序或Windows运行时组件一样。
由于F#也支持PCLs,Windows 8.1和Windows Phone 8.1都是支持的目标,我想用F#PCLs实现同样的目标(如果可能的话)。虽然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>
并将以下内容添加到/code>中
<TargetPlatform Include="WindowsPhoneApp, Version=8.1" />
<TargetPlatform Include="Windows, Version=8.1" />
在这些更改之后,我能够像在C#PCL中一样在F#PCL中使用和生成Windows运行时类型(在F#PCL或C#(通用)Windows应用程序中没有Visual Studio的抱怨,但是当我实际运行(通用)Windows应用程序时,当从C#(通用)Windows应用程序在F#PCL中调用使用Windows运行时类型的函数时,我会遇到以下异常:
application name.exe中出现“System.IO.FileNotFoundExCeption"类型的异常,但未在用户代码中处理
其他信息:无法加载文件或程序集“windows,version=255.255.255.255,culture=neutral,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" />
到。之后,引用将显示在解决方案资源管理器的F#PCL中,并具有以下引用属性:
但不能解决问题。也就是说,我仍然得到与之前相同的异常。
我还尝试通过Visual Studio的解决方案资源管理器的上下文菜单复制和粘贴Windows引用,但它会发出错误消息。
您知道如何正确地将Windows引用添加到F#PCL吗?这将是非常棒的,因为这将使编写(通用的)Windows应用程序几乎完全用F#!如果你知道这是不可能的,那么你能解释一下是什么阻碍了这一切的实现吗?
编辑:改进了异常消息的格式
你正在制作一个可移植的类库。F#不支持windows store应用程序,因此在这种情况下使用F#的唯一方法是从C#调用它。如果你成功了,你将是所有人中的第一个。