来自http://social.msdn.microsoft.com/Forums/windowsapps/en-US/386eb3b2-e98e-4bbc-985f-fc143db6ee36/read-local-file-in-portable-library#386eb3b2-e98e-4bbc-985f -fc143db6ee36
无法在 Windows 应用商店应用程序和 Windows Phone 8 应用程序之间进行文件访问。您将不得不使用特定于平台的代码来打开文件并获取流。然后,您可以将流传递到 PCL。
如果您使用内容构建操作构建它,则 XML 不在 DLL 中。它在文件系统上,无法从 PCL 内部获取。这就是为什么所有答案都将构建操作设置为Embedded Resource。它将文件放在MyPCL.DLL\Path\To\Content.xml
.
但是,如果您将构建操作设置为Content并将复制类型设置为Copy if newer,它会将您的文件放在与可执行文件相同的目录中。
因此,我们可以在我们的 PCL 中放置一个用于读取文件的接口。在启动我们的不可移植代码时,我们将一个实现注入 PCL。
namespace TestPCLContent
{
public interface IContentProvider
{
string LoadContent(string relativePath);
}
}
namespace TestPCLContent
{
public class TestPCLContent
{
private IContentProvider _ContentProvider;
public IContentProvider ContentProvider
{
get
{
return _ContentProvider;
}
set
{
_ContentProvider = value;
}
}
public string GetContent()
{
return _ContentProvider.LoadContent(@"Content\buildcontent.xml");
}
}
}
现在 PCL 已在上面定义,我们可以在不可移植的代码中创建我们的接口实现(如下):
namespace WPFBuildContentTest
{
class ContentProviderImplementation : IContentProvider
{
private static Assembly _CurrentAssembly;
private Assembly CurrentAssembly
{
get
{
if (_CurrentAssembly == null)
{
_CurrentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
}
return _CurrentAssembly;
}
}
public string LoadContent(string relativePath)
{
string localXMLUrl = Path.Combine(Path.GetDirectoryName(CurrentAssembly.GetName().CodeBase), relativePath);
return File.ReadAllText(new Uri(localXMLUrl).LocalPath);
}
}
}
在应用程序启动时,我们注入实现,并演示加载内容。
namespace WPFBuildContentTest
{
//App entrance point. In this case, a WPF Window
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ContentProviderImplementation cpi = new ContentProviderImplementation();
TestPCLContent.TestPCLContent tpc = new TestPCLContent.TestPCLContent();
tpc.ContentProvider = cpi; //injection
string content = tpc.GetContent(); //loading
}
}
}
编辑:为简单起见,我将其保留为字符串而不是 Streams。