12

私が直面している問題は次のとおりです。

サービス接続をカプセル化するポータブル クラス ライブラリを開発しました。このクラス ライブラリ内には、文字列を含む Resources.resw ファイルがあります。これらの文字列は、クラス ライブラリのメソッドによってのみ呼び出されます (たとえば、ToString() メソッドをオーバーライドするため)。

私が言ったように、これは移植可能なクラス ライブラリです。dll として参照したり、別のソリューション内のプロジェクトとして参照したりすると、正しくビルドおよびコンパイルされます。次に、アプリケーション内でこのライブラリのメソッドを使用して呼び出しを行います。

        ClientFacadeConnector connector = new ClientFacadeConnector();
        ICollection<SearchResult> results = null;
        string message = string.Empty;

        if (maxResults != -1) //Search with max Results
        {
            try
            {
                if (!contextQuery.Trim().Equals(string.Empty))
                {

                    results = await connector.GetConnected().SearchAsync(contextQuery, query, maxResults);
                    message = "Search with ContextQuery " + contextQuery + ", Query " + query + ", max results " + maxResults.ToString();
                }
                else
                {

                    results = await connector.GetConnected().SearchAsync(query, maxResults, true);
                    message = "...using normal Query search, Query " + query + ", max results " + maxResults.ToString();
                }
            }
            catch (IQserException ex)
            {
                message = ex.Message;
            }
        }


        if (results != null)
        {
            ICollection<LocalSearchResult> contentResults = new List<LocalSearchResult>();
            foreach (SearchResult s in results)
            {
                var q = s.ToString();
                var contentItem = await connector.GetConnected().GetContentAsync(s.ContentId);
                LocalSearchResult lContent = new LocalSearchResult(contentItem);
                lContent.Score = s.Score;
                lContent.Relevance = s.Relevance;
                lContent.MarkFullText(query);
                contentResults.Add(lContent);
            }

s.ToString() メソッドを呼び出した時点で、「リソース マップが見つかりません」というエラーが表示されます。

これがどこから来たのかを説明するには:

public static class AppResources
{
    private static ResourceLoader resourceLoader;

    static AppResources()
    {
        // Load local file Resources.resw by default
        resourceLoader = new ResourceLoader();            
    }

    public static string GetResources(string key)
    {
        if (string.IsNullOrEmpty(key))
            throw new ArgumentNullException("key");

        return resourceLoader.GetString(key);
    }

}

オーバーライドされた ToString() メソッド内には、次のようなコードがあります。

    public override string ToString()
    {
        StringBuilder buf = new StringBuilder(AppResources.GetResources("InstrSearchResultContent"));

        if (ContentId != -1)
        {
            buf.Append(AppResources.GetResources("StringContent") + " ID:" + ContentId.ToString() + " | ");
        }
        else
        {
            buf.Append(AppResources.GetResources("StringNo") + AppResources.GetResources("StringContent") + "ID" + " | ");
        }
        ...

リソース ファイルは resources.resw と呼ばれ、他に何も呼び出されない場合に ResourceLoader が呼び出す既定の resw ファイルです。

奇妙なことに、クライアント アプリケーション内のリソース ファイルをローカルにコピーすると、クラス ライブラリ リソース ファイルへのすべての呼び出しで正しく参照され、すべてが機能します。

このクラス ライブラリは、完成すると SDK になるはずです。リソース ファイルを個別に配布する必要はありますか?

このような問題は、通常の Class ライブラリと resx ファイルでは経験したことがありません。Reswは私にぞっとする..

4

5 に答える 5

13

を作成するときに、次のようにリソース マップの名前を指定する必要があるようですResourceLoader

resourceLoader = new ResourceLoader("Assembly/ResourceFile");

たとえば、クラス ライブラリの名前が「Company.Lib.dll」で、リソース ファイルが「Resources.resw」の場合、次のように使用します。

resourceLoader = new ResourceLoader("Company.Lib/Resources");

これは MSDN で完全に文書化されていないようです。リソース ファイルの名前を指定するだけでよいことが示唆されていますが、それは Windows ストア アプリケーション プロジェクトにあるリソース ファイルに対してのみ機能する可能性があります。ライブラリの場合、アセンブリ名も指定する必要があることを示したのはこのページでした。

于 2013-04-04T14:53:44.240 に答える
8

How to load string resourcesのすべての手順を繰り返しても、同様の問題がありました。問題は、Resources.resw ファイルが空だったことです。偽の文字列を追加すると、すべてが期待どおりに機能し始めました。

于 2013-07-18T11:33:22.200 に答える
4

プロパティでreswファイルのビルドアクションをPRIResourceに変更することで解決した同様の問題がありました。既存の resx の名前を resw に変更しましたが、ドキュメントには、ビルド アクションも変更する必要があるとは記載されていません。

于 2012-12-05T16:05:52.360 に答える
2

@Rory MacLeod によって投稿された受け入れられた回答は、もはや真実ではない可能性があります。ResourceLoader(String)私は試してみましたが、VSは非推奨であると警告しました。私の場合、以下が機能しました:

var loader = ResourceLoader.GetForCurrentView();
string localName = loader.GetString("someKey");
于 2014-09-12T20:51:34.830 に答える