私が直面している問題は次のとおりです。
サービス接続をカプセル化するポータブル クラス ライブラリを開発しました。このクラス ライブラリ内には、文字列を含む 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は私にぞっとする..