Không thể tìm thấy bất kỳ tài nguyên phù hợp cho văn hóa được chỉ định hoặc văn hóa trung lập


194

Tôi có hai dự án ASP.NET Web (ProjectA và ProjectB). Khi lớp trong ProjectA đang khởi tạo một lớp ProjectB sử dụng tệp tài nguyên Blah.resx, tôi gặp lỗi này:

Một ngoại lệ của loại 'System.Resource.MissingManifestResourceException' đã xảy ra trong mscorlib.dll nhưng không được xử lý trong mã người dùng.

Không thể tìm thấy bất kỳ tài nguyên phù hợp cho văn hóa được chỉ định hoặc văn hóa trung tính. Đảm bảo rằng "Tài nguyên.B nhớ.resours" đã được nhúng hoặc liên kết chính xác vào cụm "App_GlobalResource.sn_flri6" tại thời điểm biên dịch hoặc tất cả các cụm vệ tinh cần có đều có thể tải và ký đầy đủ.

Điều gì gây ra điều này?

Có một bài viết trên trang web của Microsoft về http://support.microsoft.com/kb/318603 này gợi ý:

Để giải quyết vấn đề này, hãy di chuyển tất cả các định nghĩa lớp khác để chúng xuất hiện sau định nghĩa lớp của biểu mẫu.

Đây là một giải pháp cho dự án Windows Forms, tôi không chắc liệu điều đó cũng áp dụng cho các dự án Web hay không.


Những loại dự án này là gì? 2 trang web? 1 trang web, 1 thư viện lớp?
Ruddy

Hai dự án trang web ASP.NET.
dev.e.loper

11
+1 cho To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.Điều này đã giải quyết vấn đề của tôi.
OmarOthman

1
+1 định nghĩa câu hỏi của bạn với liên kết Trợ giúp Windows.Forms Project Microsoft đã khắc phục sự cố của tôi.
DarrenMB

Câu trả lời này đã giải quyết vấn đề cho tôi! GetGlobalResourceObject
DanielV

Câu trả lời:


257

Tôi chỉ gặp trường hợp ngoại lệ tương tự trong một dự án WPF. Sự cố xảy ra trong một hội đồng mà gần đây chúng tôi đã chuyển sang một không gian tên khác ( ProblemAssembly.Supportđến ProblemAssembly.Controls). Ngoại lệ đã xảy ra khi cố gắng truy cập tài nguyên từ tệp tài nguyên thứ hai tồn tại trong tập hợp.

Hóa ra tệp tài nguyên bổ sung đã không chuyển đúng các tham chiếu từ tên không gian tên cũ sang tên không gian tên mới.

Trong designer.cs cho tệp tài nguyên, có một thuộc tính tĩnh để lấy ResourceManager. Trong getter đó, chuỗi vẫn tham chiếu không gian tên cũ. Sau khi sửa nó thành không gian tên mới, vấn đề đã được giải quyết:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

nên có:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);

Hy vọng điều này sẽ giúp người tiếp theo.


5
+1 Giải thích tốt về nơi xác định nguyên nhân trong tệp thiết kế. Đã tìm thấy và khắc phục sự cố tương tự nhờ bạn :)
Mã hóa

1
liên kết: tài liệu MSDN cho lớp ResourceManager .
Boinst

3
Cảm ơn nó đã giúp tôi giải quyết vấn đề này. Người ta cũng có thể xóa tệp thiết kế, sau đó mở rồi lưu tệp resx để tạo lại tệp thiết kế chính xác.
Serge

1
Tôi đã có cùng một vấn đề và đây là câu trả lời tôi đang tìm kiếm. Đáng buồn thay, nó không xuất hiện vào thời gian biên dịch :-( Cảm ơn
noob

2
cảm ơn cũng có vấn đề này nhưng đó là vì tôi đã thêm một thư mục con có cùng tên với phần cuối của không gian tên của dự án nên nó đang tìm kiếm project.folder.folder. class thay vì project.folder. class. Tôi đã chuyển nó đến thư mục gốc và bây giờ nó xếp hàng và hoạt động!
SelAromDotNet

115

Tôi đã giải quyết vấn đề như thế này:

  1. Nhấp chuột phải vào ResourceFile của bạn
  2. Thay đổi thuộc tính "Xây dựng hành động" Biên dịch thành "Tài nguyên nhúng"
  3. Sau đó xây dựng và chạy

Nó hoạt động hoàn hảo.


@sibi Elango Tôi nhấp chuột phải vào ResourceFile của mình nhưng không thể tìm thấy phần Build Action.
S5498658

1
@ S5498658 Nếu bạn không thấy điều này trong menu ngữ cảnh (nhấp chuột phải), hãy tìm trong bảng Thuộc tính (thường nằm bên dưới trình khám phá giải pháp).
định nghĩa

Hành động xây dựng của nó nhưng vẫn không hoạt động. Ngoài ra tôi đã kiểm tra thư mục và thư mục là giống nhau dưới thuộc tính.
hải âu

1
Sẽ thật tuyệt nếu câu trả lời giải thích tại sao giải pháp này hoạt động.
Luis Teijon

điều này thật tuyệt vời
code4j

22

Khi tôi thử chia sẻ tệp resource.resx từ một dự án C # với một dự án C # khác, tôi đã gặp vấn đề này. Đề xuất di chuyển lớp Form vào đầu tập tin của nó là không phù hợp. Đây là cách tôi giải quyết nó. Về cơ bản, bạn sử dụng một liên kết từ dự án thứ hai đến dự án đầu tiên, sau đó cho phép tạo lại resource.designer.cstệp.

  1. Xóa Properties/Resources.resxtập tin của dự án thứ hai
  2. Thêm Properties/Resources.resxtệp của dự án đầu tiên dưới dạng LINK vào thư mục Thuộc tính trong dự án thứ hai. Đừng thêm nó vào cấp gốc của dự án.
  3. Đừng thêm dự án đầu tiên Properties/Resources.designer.cs!
  4. Trên các thuộc tính của dự án thứ hai Resources.resx, thêm ResXFileCodeGeneratorlàm CustomTool
  5. Nhấp chuột phải vào Resources.resxvà chọn "Chạy công cụ tùy chỉnh". Điều này sẽ tạo ra một tập tin designer.cs mới.

Lưu ý: Tôi sẽ tránh chỉnh sửa tệp resource.designer.cs, vì đây là tự động phát sinh.


12

Trong trường hợp của tôi, một loạt các thay thế văn bản toàn cầu được suy nghĩ tồi tệ đã vô tình thay đổi dòng này trong tệp cs của nhà thiết kế tài nguyên.

nhập mô tả hình ảnh ở đây

Vì không gian tên trong đối số đó không khớp với không gian tên của lớp nữa, ứng dụng đã bị lẫn lộn trong thời gian chạy.

Kiểm tra xem không gian tên của trình thiết kế có khớp với đối số chuỗi trong dòng đó không.


1
chính xác là vấn đề của tôi Cám ơn vì đã chia sẻ!
AcidJunkie

Tương tự ở đây: nó xảy ra sau khi di chuyển từ PCL sang .NET Standard, khi tôi tạo một dự án và không gian tên tạm thời, trong đó tôi đã sao chép tất cả các tệp di động, xóa dự án di động và đưa không gian tên trở lại ban đầu, dòng này vẫn chứa tạm thời không gian tên từ quá trình di chuyển.
Zerga

11

Nó xảy ra bởi vì *.resхđược loại trừ khỏi di cư.

  • Nhấp chuột phải vào ResourceFile của bạn
  • Nhấp vào mục menu "Bao gồm trong dự án"

2
CÁi này đã sửa nó giúp tôi. Thông thường tệp resx được thêm tự động. Tôi đã làm một hợp nhất mà tôi đã phải thay đổi hồ sơ dự án và thêm nhân công nhập cư bằng tay, vì vậy có lẽ đó có cái gì để làm với nó
smarty

Đã làm cho tôi. Tôi phải thêm tất cả các tệp * .resx của mỗi lần di chuyển. Cảm ơn
m.rufca

7

Tôi thấy rằng việc xóa tệp designer.cs, ngoại trừ tệp resx khỏi dự án và sau đó bao gồm lại nó thường khắc phục loại vấn đề này, theo cách tái cấu trúc không gian tên (theo câu trả lời của CFinck)


Đây là những gì đã làm cho tôi! (đã thử câu trả lời của CFinck vì nó có vẻ phù hợp, nhưng nó không hoạt động)
thắng

Thật vậy, một trong những giải pháp nhanh nhất
Lorenz Lo Sauer

6

Không ai có vẻ đã đề cập đến giải pháp này. Rõ ràng thực sự - nhưng vấp ngã tôi một lúc ...

Công cụ sửa đổi truy cập mặc định cho tệp tài nguyên mới là Internal(hoặc Friendtrong VB.Net.) Đảm bảo bạn thay đổi điều này thànhPublic

(trong trình thiết kế resx có phần thả xuống ở trên cùng cho công cụ sửa đổi truy cập)


4

Chỉ riêng câu trả lời của Sibi Elangos là không đủ với tôi, vì vậy tôi phải

  • Nhấp chuột phải vào ResourceFile của bạn
  • Thay đổi thuộc tính "Xây dựng hành động"
  • Biên dịch thành "Tài nguyên nhúng"
  • Xây dựng và triển khai

Điều này sẽ tạo ra một App_GlobalResource trong /binthư mục của bạn , bây giờ cũng sao chép thư mục đó vào thư mục gốc của ứng dụng web


4

Trong trường hợp của tôi, vấn đề gây ra bởi việc định nghĩa lớp sai cách:

namespace MyBuggyWorld
{
    public class BackendObject //This hack broke the VS 2017 winform designer and resources linker!
    {
        public TcpClient ActiveClient { get; set; }
        public BackgroundWorker ActiveWorker { get; set; }
    }
    public partial class FormMain : Form
    {
    }
}

Sau khi Tái phân bổ BackendObjectđến cuối (tốt hơn để tách tệp), thực hiện dự án sạch + xây dựng lại đã giải quyết vấn đề.


1
Ồ, tôi đã không nhận ra rằng việc có lớp sai khi bắt đầu tập tin sẽ phá vỡ mọi thứ rất tệ.
BrainStorm.exe

4

Tôi đã giải quyết điều này bằng cách đi đến dự án nơi tệp tài nguyên của tôi được lưu, cuộn xuống Itemgroup của nó và thêm một tên logic tương ứng với đường dẫn mà trình biên dịch mong đợi.

EmbeddedResource của tôi trông như thế này:

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

Bây giờ nó trông như thế này

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>

3

Đối với trường hợp này có liên quan, hãy kiểm tra xem tập hợp chứa tài nguyên có không gian tên mặc định được đặt thành cùng một văn bản không (Project-> Properties-> Không gian tên mặc định; trong VS) Kiểm tra xem liệu tệp resx có thuộc tính BuildAction được đặt thành "Nhúng không tài nguyên "Tận hưởng ...;)


1
Xin chào, bạn có nghĩa là văn bản không gian tên (xxx) mặc định phải giống như trong mã: Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
DanielV

2

Một cách tiếp cận là đưa các lớp / tài nguyên được chia sẻ vào một dự án thư viện lớp riêng và giới thiệu chúng trong cả hai trang web.


2
Chắc chắn đây là vấn đề tương tự phải không?
Brett Rigby

2

Cảm ơn @CFinck! Chỉ để thêm một mẹo cho người khác: Tôi đã thay đổi dòng ResourceManager bằng cách này:

New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

Tôi đang ở vb.net nhưng tôi nghĩ trong C #, sự khác biệt duy nhất sẽ là + thay vì & nối chuỗi.

Bằng cách này, tôi có thể sử dụng cùng các tệp lắp ráp được liên kết trong hai dự án tương tự có chung tài nguyên.


1

Lỗi này cũng được đưa ra bởi Dotfuscation, vì tệp thiết kế resx phụ thuộc vào sự phản chiếu. Nếu bạn đang sử dụng Dotfuscator, nó sẽ phá vỡ các tệp resx của bạn. Bạn phải luôn thêm chúng dưới dạng loại trừ khỏi quy trình che giấu.


1

Khi chúng ta đang sử dụng

HttpContext.GetGlobalResourceObject()

Nó sẽ tạo ra lỗi đó trừ khi chúng ta gói cuộc gọi đó bên trong câu lệnh try / Catch.


1

Tôi có một ứng dụng WinForms với một dự án duy nhất trong giải pháp.
Nhắm mục tiêu .NET Framework 4.0
Sử dụng SharpDevelop 4.3như IDE của tôi

Nghe có vẻ ngớ ngẩn, nhưng tôi tình cờ có Logical Nametài sản được đặt "Resources"trong "Resources.resx"tập tin của tôi . Khi tôi xóa tài sản đó, tất cả các công trình hunky-dory.

Thông thường, khi bạn thêm các tệp ngẫu nhiên EmbeddedResource, bạn thường muốn đặt Logical Namemột cái gì đó hợp lý, vì một số lý do, tôi đã làm tương tự trên Resources.resxtệp và điều đó làm hỏng tất cả ...

Hy vọng điều này sẽ giúp được ai đó.


Tôi dường như cũng có điều này. Một cuộc xung đột đặt tên tôi đoán, tìm thấy tốt!
Trent

1

Đối với tôi, vấn đề là sao chép các tệp .resx và các tệp .cs liên quan từ dự án này sang dự án khác. Cả hai dự án đều có cùng một không gian tên nên đó không phải là vấn đề.

Cuối cùng đã giải quyết nó khi tôi nhận thấy trong Solution Explorer rằng trong dự án ban đầu, các tệp .resx phụ thuộc vào các tệp .cs:

MyResource.cs
|_ MyResource.resx

Trong khi trong dự án được sao chép, các tệp .cs phụ thuộc vào các tệp .resx:

MyResource.resx
|_ MyResource.cs

Hóa ra trong dự án thứ hai, bằng cách nào đó, các tệp .resx đã được đặt thành tự động tạo các tệp .cs. Các tệp .cs được tạo tự động đã ghi đè lên các tệp .cs được sao chép từ dự án ban đầu.

Để khắc phục sự cố chỉnh sửa các thuộc tính của từng tệp .resx trong dự án đã sao chép. Các công cụ Custom bất động sản sẽ được thiết lập để một cái gì đó giống như ResXFileCodeGenerator . Xóa thuộc tính Công cụ tùy chỉnh của tệp .resx. Bạn sẽ cần sao chép lại tệp .cs từ dự án ban đầu vì nó sẽ bị ghi đè bởi tệp được tạo tự động.


1

Trong trường hợp của tôi, tôi đã đặt một lớp mới trên đầu biểu mẫu Windows, trong cùng một tệp.

Di chuyển lớp mới được thêm vào khỏi tập tin đó đã khắc phục vấn đề.

Xem tại đây: http://i.stack.imgur.com/wVu6c.png


1
Chào mừng bạn đến với Stackoverflow! Nếu bạn có mã để chia sẻ với chúng tôi, vui lòng không đăng nó dưới dạng hình ảnh. Bạn có thể thêm nó vào bài viết của bạn và định dạng nó dưới dạng mã .
FelixSFD

Cảm ơn bạn @FelixSFD về gợi ý
Petre

1

Điều này có thể được gây ra bởi không gian tên không khớp. Câu trả lời thứ hai từ câu trả lời hàng đầu (của Sibi Elango) nói rằng nhấp chuột phải vào tệp resx và thay đổi tùy chọn Build thành EmbeddedResource, nhưng tôi đã làm điều đó và vẫn gặp lỗi. Câu trả lời hàng đầu (CFinck's) lưu ý cách khắc phục điều này thông qua các tệp chỉnh sửa thủ công, tuy nhiên, tôi gặp vấn đề này trong MonoDevelop và phải đặt không gian tên mặc định giống như tệp cs đang gọi tài nguyên (tệp mà chứa mã như mã bên dưới) ...

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

Sau khi đặt không gian tên mặc định qua GUI, dòng trên không còn gây ra ngoại lệ.


1

Chỉ là một trường hợp khác. Tôi đã sao chép một giải pháp với hai dự án và đổi tên một phần trong Windows explorer (tên thư mục, tên tệp .sln và .csproj) và một phần với hành động Tìm & Thay thế lớn trong Visual Studio (không gian tên, v.v.). Tuy nhiên, ngoại lệ được tuyên bố bởi OP vẫn xảy ra. Tôi phát hiện ra rằng tên hội và tên không gian vẫn còn cũ.

Mặc dù dự án và mọi thứ khác đã được đặt tên OfficeStyle sự Assembly nameDefault namespacevẫn còn được đặt tên Linckus .

Tình hình cũ

Sau khi hiệu chỉnh, mọi thứ hoạt động tốt trở lại, biên dịch và chạy thời gian :)

Tình hình mới


0

Trong trường hợp của tôi, những dòng mã này được thêm vào để Web.configgiúp rất nhiều:

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

Cùng với hành động Xây dựng: Embedded Resourcevà Công cụ tùy chỉnh : PublicResXFileCodeGenerator.


0

Thuộc tính Double Click trong phần Ứng dụng kiểm tra Tên hộikhông gian tên mặc định giống nhau


0

Tôi cũng đang đối mặt với cùng một vấn đề, đã thử tất cả các giải pháp được đề cập trong câu trả lời nhưng dường như không có cách nào hiệu quả. Hóa ra trong quá trình đăng ký mã thành TFS. TFS không kiểm tra tệp Resx mà nó chỉ kiểm tra trong tệp thiết kế. Vì vậy, tất cả các nhà phát triển khác đã phải đối mặt với vấn đề này trong khi chạy trên máy của họ. Kiểm tra tệp resx bằng tay đã thực hiện thủ thuật


Bạn có ý nghĩa gì khi "kiểm tra"?
Fandango68

Đẩy tệp lên TFS
Kayani

0

Điều này cũng có thể xảy ra khi đặt một lớp bên trên lớp winform chính (ví dụ Form1) Bạn có thể thấy điều này khi bạn nhìn vào thiết kế, vì nó không được hiển thị.


0

Một nguyên nhân khác: nếu không gian tên của bạn có dấu gạch nối ("-"), thì nó sẽ xây dựng và chạy chính xác, nhưng tài nguyên sẽ không thể truy cập được. Không gian tên (định danh) không được phép có dấu gạch nối, nhưng điều này dường như không được thực thi ở bất cứ đâu ngoại trừ trong việc tải tài nguyên. Điều này đã đốt cháy tôi hai lần trong thập kỷ.


0

Một điều khác để kiểm tra là nếu bạn có LogicalName hoặc ManifestResourceName được xác định trên EmbeddedResource. Hãy chắc chắn rằng chúng được xác định một cách thích hợp nếu tệp dự án của bạn đang sử dụng chúng vì chúng có thể khiến các tài nguyên tồn tại dưới một tên mà bạn không mong đợi.


0

Tôi gặp vấn đề này khi chạy lệnh Migration. Update-Databasetrong bảng điều khiển Gói quản lý.

Câu trả lời được chấp nhận đã không giải quyết vấn đề của tôi.

Tôi đã phải thay đổi Build Action từ Compilethành Embedded Resourcevà Nó hoạt động với tôi.

Bạn có thể làm tương tự bằng các bước dưới đây:

  1. Nhấp chuột phải vào di chuyển.
  2. Thay đổi thuộc tính "Xây dựng hành động" "Biên dịch" thành "Tài nguyên nhúng"
  3. Chạy lệnh Update-Database.

0

Đối với người dùng phải đối mặt với điều này trong .NET Core 3.0, điều này có thể liên quan đến thay đổi đột phá được thực hiện trong .NET Core 3.0, để giải quyết nó chỉ được đặt EmbeddedResourceUseDependentUponConventionthành false trong dự án của bạn csproj:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>

0

Nhấp chuột phải vào tài nguyên và chọn Run Custom Tool

Điều này sẽ sửa chữa các nhà thiết kế


-1

Chỉ vì bạn đang tham khảo DLL của Project B không có nghĩa là Trình quản lý tài nguyên của Dự án A biết về thư mục App_GlobalResource của Project B.

Bạn đang sử dụng các dự án trang web hoặc dự án ứng dụng web? Sau này, Visual Studio sẽ cho phép bạn liên kết các tệp mã nguồn (không chắc chắn về cái trước, tôi chưa bao giờ sử dụng chúng). Đây là một tính năng ít biết nhưng hữu ích, được mô tả ở đây . Bằng cách đó, bạn có thể liên kết các tệp tài nguyên Project B vào Project A.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.