2012-05-29 21 views
9

Vấn đề tôi đang phải đối mặt có thể như sau:ResourceMap không tìm thấy lỗi khi tham chiếu một tập tin tài nguyên trong một thư viện lớp cầm tay

tôi đã phát triển một thư viện lớp cầm tay để đóng gói một kết nối dịch vụ. Bên trong thư viện lớp này có một tệp tin Resources.resw chứa các chuỗi. Các chuỗi này được gọi chỉ bằng các phương thức của thư viện lớp (ví dụ để ghi đè các phương thức ToString()).

Như tôi đã nói đây là thư viện lớp di động. Nếu tôi tham khảo nó như là một dll, hoặc thậm chí là một dự án bên trong một giải pháp khác, nó được xây dựng và biên dịch một cách chính xác. Sau đó, tôi thực hiện cuộc gọi sử dụng một phương pháp thư viện này trong ứng dụng của tôi, nói

 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); 
      } 

Tại điểm mà tôi gọi là phương pháp s.ToString(), tôi nhận được một lỗi "không tìm thấy tài nguyên Bản đồ".

Để giải thích nơi này xuất phát từ:

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); 
    } 

} 

và bên trong phương pháp ghi đè ToString() có mã mà trông như sau:

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" + " | "); 
     } 
     ... 

Các tập tin tài nguyên được gọi là resources.resw và là tệp resw mặc định mà ResourceLoader gọi nếu không có khác được gọi.

Kỳ lạ, nếu tôi sao chép tệp tài nguyên bên trong ứng dụng khách cục bộ, nó được tham chiếu chính xác bởi tất cả các cuộc gọi đến tệp tài nguyên thư viện lớp và mọi thứ hoạt động.

Thư viện lớp này được coi là SDK khi hoàn tất. Tôi có cần phân phối tệp tài nguyên riêng biệt không?

Sự cố như vậy mà tôi chưa bao giờ gặp phải với các thư viện lớp và tệp resx bình thường. Resw đang đưa cho tôi các creep ..

Trả lời

2

Câu trả lời được chấp nhận được đăng bởi @Rory MacLeod có thể không còn đúng nữa. Tôi đã thử và VS cảnh báo rằng ResourceLoader(String) không còn được dùng nữa.Các trường hợp sau hoạt động trong trường hợp của tôi:

var loader = ResourceLoader.GetForCurrentView(); 
string localName = loader.GetString("someKey"); 
+2

vẫn gặp lỗi tương tự. Chúng ta có cần khởi tạo cái gì trước đó không? – hellodear

+0

Tôi không nghĩ rằng nó không được chấp nhận. Tôi không nhận được bất kỳ tin nhắn như thế vào năm 2017 ngay bây giờ. Tham số chuỗi được sử dụng nếu bạn sử dụng đường dẫn khác với đường dẫn mặc định Strings Tôi tin rằng – batmaci

+0

Với ** ResourceLoader.GetForCurrentView() ** Tôi nhận được cùng một lỗi ("Bản đồ tài nguyên không tìm thấy"). ** Giải pháp ResourceLoader ("Assembly/ResourceFile") ** mới đang hoạt động nhưng đi kèm với cảnh báo không dùng nữa. – jannikb

4

Tôi đã gặp sự cố tương tự mà tôi đã giải quyết bằng cách thay đổi Tác vụ xây dựng của tệp đã gửi lại thành PRIResource trong thuộc tính. Tôi đã đổi tên một resx hiện có thành resw nhưng tài liệu không đề cập đến việc bạn cũng phải thay đổi hành động xây dựng.

12

Dường như bạn phải chỉ định tên của bản đồ tài nguyên khi bạn tạo ResourceLoader, như thế này:

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

Ví dụ, nếu thư viện lớp học của bạn được gọi là "Company.Lib.dll", và tập tin tài nguyên của bạn là "Resources.resw", bạn sẽ sử dụng:

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

này dường như không phải được ghi chép đầy đủ trên MSDN - nó gợi ý rằng bạn chỉ có thể chỉ định tên của tập tin tài nguyên của bạn, nhưng nó có thể chỉ hoạt động với các tệp tài nguyên có trong Cửa sổ Dự án ứng dụng cửa hàng s. It was this page cho tôi thấy rằng, đối với thư viện, bạn cũng cần chỉ định tên lắp ráp.

+0

này đã giúp tôi ra! +1 – borrrden

+0

đã giúp tôi rất nhiều, cảm ơn +1 – katho2404

7

Tôi cũng gặp sự cố tương tự ngay cả khi lặp lại tất cả các bước từ How to load string resources. Vấn đề là tệp Resources.resw của tôi trống. Khi tôi thêm một số chuỗi giả vào tất cả bắt đầu làm việc như mong đợi.

0

Tôi gặp phải sự cố tương tự khi phát triển ứng dụng UWP với thư viện lớp học. Vì vậy, tôi có tệp /Strings/en-Us/Resource.resw trong thư viện của mình.

ResourceLoader.GetForCurrentView().GetString("someKey"); 

đưa ra một ngoại lệ

new ResourceLoader("Company.Lib/Resources").GetString("someKey"); 

mang lại cho tôi một lời cảnh báo không dùng nữa nhưng hoạt động.

Giải pháp của tôi mà không đưa ra một cảnh báo là thế này:

ResourceLoader.GetForViewIndependentUse("AssemblyNamespace/Resources").GetString("someKey");