22

Windows Phone アプリケーションに使用しているポータブル ライブラリがあります。同じポータブル ライブラリに、いくつかのコンテンツ ファイル ( Build Action = Content ) があります。

DataReaderストリームをコンテンツ ファイルに返すことになっているポータブル ライブラリにクラスを作成しました。ただし、以下のコードを使用すると、一貫してnullから戻ってきGetManifestResourceStreamます。私は何を間違っていますか?

public class DataReader
{
    public static Stream GetStream(string code)
    {
        string path = string.Format("./data/code-{0}.dat", code);
        return Assembly.GetExecutingAssembly().GetManifestResourceStream(path);
    }
}
4

8 に答える 8

9

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 に渡すことができます。

Content ビルド アクションでビルドする場合、XML は DLL 内にありません。ファイルシステム上にあり、PCL 内から取得する方法はありません。そのため、すべての回答でビルド アクションがEmbedded Resourceに設定されています。内にファイルを配置しますMyPCL.DLL\Path\To\Content.xml

ただし、ビルド アクションをContentに設定し、コピー タイプをCopy if newerに設定すると、ファイルは実行可能ファイルと同じディレクトリに配置されます。

ソリューション エクスプローラー、プロパティ、および Windows エクスプローラー

したがって、ファイルを読み取るためのインターフェイスを 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
        }
    }
}

編集:簡単にするために、ストリームではなく文字列のままにしました。

于 2013-11-01T00:31:52.227 に答える
2

ファイルをポータブル リソースに追加し、ビルド アクションをEmbedded Resourceに設定します。たとえば、 files GB.pngUS.pngfolder の下CountryFlags

次のようなコードで getter 関数を追加します (ここでは、countryflag getter イメージに固有のものです)。

public class CountryFlags {
    public static Stream GetFlagStream(string countryIsoCode2ch)
    {
        var flagname = "Full.DLL.Name.CountryFlags.{0}.png";
        var rs = Assembly.GetExecutingAssembly().GetManifestResourceStream(
                   string.Format(flagname, countryIsoCode2ch));

        return rs;
    }
}

Full.DLL.Name生成されたポータブル ライブラリの.dll拡張前の部分を次に示します。(注: Anything.Resources.dllは、少なくとも XAP などを生成するときに Visual Studio によって無視されるため、ライブラリの悪い名前です。代わりに、たとえばAnything.PortableResource.dll動作します)。

于 2012-11-15T08:49:05.157 に答える
0

ファイルをリソースとして追加した場合は、.Designer.cs を確認してください。リソースごとにプロパティがあります。そこからアクセスできます。

これは、dat ファイル リソースの自動生成プロパティのサンプルです。

   internal static byte[] MyDatFile {
        get {
            object obj = ResourceManager.GetObject("MyDatFile", resourceCulture);
            return ((byte[])(obj));
        }

あなたはとしてdatファイルを読むことができます

    System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
    var str = enc.GetString(Resource1.MyDatFile);
于 2012-06-09T19:30:21.457 に答える
-1

GetManifestResource ストリームを使用する代わりに Application.GetResourceStream メソッドを使用する必要があります

参照: http://msdn.microsoft.com/en-us/library/ms596994%28v=vs.95%29.aspx

var albumArtPlaceholder =  
    Application.GetResourceStream( 
        new Uri("Images/artwork.placeholder.png", UriKind.Relative)); 
于 2012-06-09T21:18:59.123 に答える