可移植类库不支持System.IO,为什么?

11

我创建了一个可移植类库,以供我的Monodroid项目使用。 但问题是,我需要System.IO库,但不幸的是我无法添加它。

我甚至尝试通过添加引用选项来添加它,但徒劳无功。

为什么会发生这种情况? 我该怎么做?


看起来Yuval的回答比我的更详细。所以我会把这个作为评论留下:它不在那里。你可以看一下这个回答,它提供了一个解决方法,并指向这个项目,可能会帮助你更进一步。 - Noctis
1
为什么呢?因为你正在寻找的API并不存在于所有平台上,例如Silverlight,Windows Phone上的Silverlight,Win 8或Win Phone 8.1上的Windows Runtime等等。一个尝试的解决方法是https://pclstorage.codeplex.com/。 - Stuart
1个回答

15

由于System.IO不是可移植类库,因此您无法使用它。 System.IO调用特定于其运行的操作系统(Windows)的功能,而可移植类库旨在跨平台。

解决方案可以在这里找到:

当您尝试编写可移植库但需要某些不受支持的功能时,该怎么办?您不能直接调用 API,也不能引用非可移植库,因为可移植库不能引用非可移植库。解决方案是在可移植库中创建一个提供所需功能的抽象,并针对每个目标平台实现该抽象。例如,如果您需要保存和加载文本文件,则可以使用以下接口:

public interface IFileStorage 
{
    Task SaveFileAsync(string filename, string contents);
    Task<String> LoadFileAsync(string filename); 
} 
在抽象化过程中,只包括所需的功能是个好主意。在这个例子里,接口并没有抽象化一般文件系统概念,如流、文件夹或枚举文件。这使得抽象更具可移植性和易于实现。方法返回任务(Task)以便Windows Store应用程序的实现可以调用WinRT文件IO API,这些API是异步的。
创建抽象化允许可移植库调用非可移植代码,而这种模式几乎适用于任何时候需要从可移植库访问非可移植功能的情况。当然,您需要某种方式让可移植代码获取对抽象实现的引用。如何做取决于您编写的是跨平台应用程序还是通用可重用库。

我建议阅读源代码并查看示例项目。除了标准实现方式外,我从中收集了许多有用的信息,特别是关于如何实现它。 - Nzall

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