MissingManifestResourceException có nghĩa là gì và cách khắc phục nó?


151

Tình huống:

  • Tôi có một thư viện lớp, được gọi RT.Servers, chứa một vài tài nguyên (thuộc loại byte[], nhưng tôi không nghĩ đó là điều quan trọng)
  • Thư viện cùng lớp chứa một phương thức trả về một trong những tài nguyên đó
  • Tôi có một chương trình đơn giản (có tham chiếu đến thư viện đó) chỉ gọi phương thức duy nhất đó

Tôi nhận được một MissingManifestResourceExceptiontin nhắn sau:

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 "Máy chủ.Resource.resource" được nhúng hoặc liên kết chính xác vào cụm "RT.Servers" 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 đủ.

Tôi chưa bao giờ chơi xung quanh với các nền văn hóa, hoặc ký hợp đồng, vì vậy tôi không biết chuyện gì đang xảy ra ở đây. Ngoài ra, điều này hoạt động trong một dự án khác sử dụng cùng một thư viện. Có ý kiến ​​gì không?


2
Đây là một trong những trường hợp ngoại lệ không hữu ích nhất trong .NET. Nó kích hoạt trong ít nhất 3 kịch bản không chia sẻ gì.
rr-

1
Xin lỗi, nhưng đó là một cách của Microsoft: xóa tất cả, sau đó thêm lại . Hoạt động cho tài nguyên, NUGET, tài liệu tham khảo và chuỗi kết nối. Có rất nhiều công cụ, nhưng bạn sẽ dành thời gian cho các tệp thô trong các trường hợp không thông thường ...
maxkoryukov

Câu trả lời:


238

Tất cả những gì tôi cần làm để khắc phục sự cố này là nhấp chuột phải vào Resources.resxtệp trong Solution Explorer và nhấp vào Chạy Công cụ Tùy chỉnh . Điều này tạo lại Resources.Designer.cstập tin được tạo tự động .

Nếu tệp .resx được thêm vào dự án theo cách thủ công, thuộc tính Công cụ tùy chỉnh của tệp phải được đặt thành "ResXFileCodeGenerator".

Vấn đề là do không phù hợp với không gian tên, xảy ra nếu bạn thay đổi "không gian tên mặc định" của cụm trong cài đặt dự án. (Tôi đã thay đổi nó từ (trước đây) "Servers"thành (bây giờ) "RT.Servers".)

Trong mã được tạo tự động trong Resources.Designer.cs, có đoạn mã sau:

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

Chuỗi ký tự "Servers.Resources"phải được thay đổi thành "RT.Servers.Resources". Tôi đã làm điều này bằng tay, nhưng chạy công cụ tùy chỉnh cũng sẽ làm tốt như vậy.


9
Điều này giúp tôi tiết kiệm rất nhiều thời gian!
Eric

1
+1! Trong VS 2010, chuỗi ký tự ResourceManager hiển thị ở trên được tự động cập nhật thành giá trị của Không gian tên mặc định trong thuộc tính dự án (tab Ứng dụng), ít nhất là cho WinForms.
TrueWill

2
Điều gì nếu bạn không có tệp resource.resx?
tro999

@ as999999: Bạn đã xem trong thư mục Thuộc tính chưa? Đó là nơi thường dành cho các dự án C #.
RenniePet

Tôi đã chạy cùng một vấn đề. Tệp .resx đã được thêm vào dự án theo cách thủ công, thuộc tính Công cụ tùy chỉnh của tệp tôi đặt thành "ResXFileCodeGenerator". tập tin .resx sau. làm thế nào tôi có thể làm cho nó ....
Kavitha

37

Tôi mới gặp vấn đề này ngày hôm nay và tôi thấy trang Trợ giúp và Hỗ trợ của Microsoft này thực sự đã khắc phục được sự cố.

Tôi đã có một vài đại biểu ở đầu tệp của mình, trong không gian tên toàn cầu và bất ngờ tôi nhận được MissingManifestResourceExceptionkhi chạy chương trình, trên dòng này:

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

Sau đó, tôi chuyển các đại biểu vào không gian tên, gặp lỗi tương tự. Cuối cùng tôi đặt các đại biểu vào lớp duy nhất trong tệp đó và lỗi đã biến mất, nhưng tôi không muốn các đại biểu trong lớp hoặc không gian tên đó.

Sau đó, tôi đã đi qua liên kết đó ở trên, cho biết

Để 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.

Tôi đặt các đại biểu (mà tôi sẽ không xem xét "định nghĩa lớp") ở dưới cùng của tệp đó, bên ngoài không gian tên cục bộ và chương trình không còn nhận được MissingManifestResourceExceptionnữa. Thật là một lỗi khó chịu. Nhưng, đó có vẻ là một giải pháp mạnh mẽ hơn so với sửa đổi mã được tạo tự động :)


Cảm ơn câu trả lời của bạn. Điều này có vẻ như bạn có một vấn đề khác gây ra cùng một triệu chứng. Tôi không có bất kỳ lớp học thêm nào trong mã của mình, thực sự tôi thậm chí không có bất kỳ hình thức nào cả. Tôi nên chỉnh sửa câu trả lời trước của mình vì tôi phát hiện ra rằng tôi thực sự không cần phải sửa đổi mã được tạo tự động. Tôi có thể vừa chạy lại trình tạo mã, và nó sẽ tự sửa. Không biết tại sao quá trình xây dựng không làm điều đó tự động.
Timwi

7
Tôi đã gặp lỗi do thêm một lớp phía trên lớp của Form trong tệp Form1.cs (như đã thảo luận trong phần "Độ phân giải" của liên kết bạn cung cấp). Cảm ơn!
Matt Smith

Vấn đề tương tự; không có gì khác hoạt động nên tôi chỉ xóa dòng: this.Icon = ((System.Drawing.Icon) (resource.GetObject ("$ this.Icon"))); Vì tôi không quan tâm đến biểu tượng ở dạng cụ thể đó :)
Gary Huckabone

Đó là câu trả lời. Cảm ơn bạn.
Sertan Pekel

Nếu bất kỳ ai nhầm lẫn tôi đã có một lớp gọi là "StringExtensions" trước bit "Form1" của Form1.cs, tôi đã di chuyển nó xuống dưới Form1 trong form1.cs thay vì ở trên và nó hoạt động
Ma Dude

31

Tôi đã gặp phải một vấn đề tương tự và, mặc dù tôi biết đó không phải là nguyên nhân của OP, tôi sẽ đăng nó ở đây để nếu ai đó gặp phải vấn đề này trong tương lai sẽ có câu trả lời.

Nếu bạn thêm một lớp trước lớp thiết kế, bạn sẽ có một MissingManifestResourceExceptionngoại lệ trong thời gian chạy (không có lỗi thời gian biên dịch hoặc cảnh báo) bởi vì

Visual Studio yêu cầu các nhà thiết kế sử dụng lớp đầu tiên trong tệp.

Đối với (một chút) thông tin thêm xem bài này .


12
Cảm ơn đã đăng "câu trả lời" này. Mặc dù nó "lạc đề" liên quan đến vấn đề của OP, nhưng nên đăng nó ở đây. Một tìm kiếm cho MissingManifestResourceException đã đưa tôi đến chủ đề này và câu trả lời của bạn đã được đặt ra cho vấn đề của tôi.
RenniePet

16

Tôi gặp vấn đề tương tự, nhưng sử dụng lệnh Run Custom Tool theo đề xuất của Timwi không giúp ích gì trong trường hợp của tôi.

Tuy nhiên, nó đưa tôi đi đúng hướng, bởi vì tôi đã kết thúc trong Thuộc tính của tệp .resx . Ở đây tôi nhận thấy một sự khác biệt với một tệp .resx khác không gây ra vấn đề gì.

Trong trường hợp của tôi, tôi đã phải thay đổi thuộc tính "Xây dựng hành động" từ "Tài nguyên" thành "Tài nguyên nhúng".

Dự đoán tốt nhất của tôi cho lý do là, tôi đã có .resx trong một thư viện được sử dụng từ một ứng dụng khác. Ứng dụng của tôi không có tệp .resx riêng , vì vậy nó phải sử dụng tệp từ thư viện - chỉ khả dụng khi được nhúng trong thư viện và không "độc lập".


2
Cảm ơn +1, tôi đã kiểm tra kỹ các tệp tài nguyên của mình cũng nằm trong một thư viện riêng được các ứng dụng khác tham chiếu. Tôi đã xây dựng Action Action thành Content và sau khi thay đổi nó thành Embedded Resource, tất cả đều hoạt động tốt. Giám sát ngớ ngẩn
Shan Plourde

1
Cảm ơn! Điều này làm việc cho tôi khi tôi có một số tệp văn bản chứa nội dung để thử nghiệm hoặc một số quy tắc ánh xạ kinh doanh. Thay đổi từ Nội dung sang Tài nguyên nhúng đã khắc phục sự cố.
S. Baggy

12

Khi tôi gặp vấn đề tương tự, trong Vs 2012, hóa ra thuộc tính "Không gian tên công cụ tùy chỉnh" của tệp resx là sai (thực tế, trong trường hợp của tôi, nó không được đặt, do đó, mã được tạo ra ngoại lệ này khi chạy) . Bộ thuộc tính cuối cùng của tôi cho tệp resx là như thế này:

  • Xây dựng hành động: Tài nguyên nhúng
  • Sao chép vào thư mục đầu ra: Không sao chép
  • Công cụ tùy chỉnh: ResXFileCodeGenerator
  • Không gian tên công cụ tùy chỉnh: My.Project.S.Proper.Namespace

3

Đồng thời xem: MissingManifestResourceException khi chạy thử nghiệm sau khi xây dựng với MSBuild (.mresource có đường dẫn trong tệp kê khai)

Tôi nhắc lại câu trả lời ở đây chỉ cho đầy đủ:

Nó xuất hiện thêm LogicalName vào tệp dự án sửa nó:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

tức là mục nhập tài nguyên được nhúng trong tệp dự án trông như thế này:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

Đây là chi tiết trong: http://bloss.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resource-files.aspx

Lưu ý rằng chúng tôi đang sử dụng tệp .resx, nhưng lỗi vẫn xuất hiện.

Cập nhật: Sự cố với tài nguyên (bao gồm XAML) dường như có liên quan đến đường dẫn đầu ra và việc sử dụng dấu gạch chéo tiến hoặc lùi như chi tiết trong: Tại sao sửa đổi thư mục đầu ra dự án gây ra: IOException không được xử lý "Không thể định vị tài nguyên 'app.xaml' . "


Sau khoảng tám giờ gỡ lỗi vấn đề này và thực sự truy tìm mọi câu trả lời của github, SO và Google, đây là câu trả lời giải quyết vấn đề của tôi ... fwiw, vấn đề của tôi bắt đầu xảy ra sau khi chuyển từ .Net 3.5 sang 4.7.2.
Neville

3

Tôi gặp phải một nguyên nhân khác của vấn đề này, không liên quan đến các tập tin resx. Tôi đã có một thư viện lớp trong đó hộiInInfo.cs chứa các mục sau:

[assembly: ThemeInfo(
ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]

Việc lắp ráp không chứa bất kỳ từ điển mã WPF, chủ đề hoặc tài nguyên nào. Tôi đã loại bỏ ngoại lệ bằng cách xóa thuộc tính ThemeInfo.

Tôi đã không nhận được một ngoại lệ thực tế, chỉ

Một ngoại lệ cơ hội đầu tiên của loại 'System.Resource.MissingManifestResourceException'.

Xem chi tiết ngoại lệ, hệ thống đã yêu cầu MyAssugging.g.resours

Hy vọng điều này có thể giúp đỡ cho người khác.


2
Cảm ơn vì điều này! Chính xác là sửa chữa tôi cần! Xảy ra khi bạn vô tình tạo một dự án ViewModel dưới dạng thư viện Control.
Andrew Hanlon

Cảm ơn bạn. CÁi này đã sửa nó giúp tôi.
Jamleck

2

Không chắc nó sẽ giúp được mọi người nhưng cái này có tác dụng với tôi:

Vì vậy, vấn đề tôi gặp phải là tôi đã nhận được thông báo sau:

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 "My.Resource.Resource.resource" được nhúng hoặc liên kết chính xác vào cụm "X" 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 đủ "

Tôi đã cố gắng để có được các tài nguyên được nhúng trong dự án của tôi từ một thư viện lớp khác.

Những gì tôi đã làm để khắc phục sự cố là đặt Bộ sửa đổi truy cập trong tab Project-> Properties-> Tài nguyên từ "Internal" (chỉ có thể truy cập trong cùng thư viện lớp) thành "Công khai" (có thể truy cập từ thư viện lớp khác)

Sau đó chạy và voilà, không còn lỗi cho tôi ...


2

Giải pháp được đưa ra bởi BlaM cũng làm việc cho tôi.

Tôi là người dùng VS 2013. Sau khi trải qua nhiều lần sửa chữa nhưng không có may mắn, tôi đã thử điều này:

  1. Bấm chuột phải vào tệp tài nguyên, từng cái một, trong trường hợp có nhiều tệp.
  2. Đảm bảo, thuộc tính "Xây dựng hành động" được đặt thành "Tài nguyên nhúng".

Đó là nó! :)


Khẳng định điều này. Tôi có một dự án đang hoạt động nhưng cần phải duy trì các cụm tài nguyên một cách riêng biệt, vì vậy đã thử chuyển từ "Tài nguyên nhúng" sang "Tài nguyên" và cuối cùng nhận được MissingResourceManifestException.
Mosca Pt

2

Tôi đã có cùng một vấn đề, nhưng trong trường hợp của tôi, tôi đặt một lớp trong một điều khiển người dùng có liên quan đến điều khiển người dùng như thế này

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

Giải pháp là di chuyển MyUserControlObjectđến cuối lớp Usercontrol, như thế này

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

Tôi hi vọng cái này giúp được


Nói về một mô tả lỗi nhảm nhí ... Tôi đã thêm một lớp trợ giúp vào tệp CS của biểu mẫu chính. Tôi sẽ không bao giờ đoán được thông báo lỗi sẽ liên kết lại với điều này. Cảm ơn!
Adam Lewis

1

Tôi đã gặp lỗi MissingManifestResourceException sau khi tôi chuyển dự án của mình từ VS2005 sang VS2010. Tôi không có bất kỳ lớp nào khác được định nghĩa trong tệp có chứa lớp Form của tôi. Và tôi cũng đã đặt lại Tên tệp tài nguyên resx của mình. Không hoạt động.

Vì vậy, tôi đã xóa các tập tin resx và tái tạo chúng. Tất cả đều tốt


1

Gần đây gặp vấn đề tương tự, đấu tranh một chút, tìm thấy chủ đề này nhưng không có câu trả lời nào là đúng cho tôi.

Vấn đề của tôi là khi tôi loại bỏ cửa sổ chính từ dự án WPF của tôi (nó không có một cửa sổ chính), tôi quên để loại bỏ StartupUritừ App.xaml. Tôi đoán ngoại lệ này có thể xảy ra nếu bạn có một sai lầm trong StartupUri, vì vậy trong trường hợp nếu ai đang gặp khó khăn này - kiểm tra của bạn StartupUritrong App.xaml.


1

Gần đây vấp phải vấn đề này, trong trường hợp của tôi, tôi đã làm một vài điều:

  1. Đảm bảo các không gian tên nhất quán trong tệp Designer.cs của tệp resx

  2. Đảm bảo không gian tên mặc định của hội (nhấp chuột phải vào dự án và chọn Thuộc tính) được đặt giống với không gian tên của tệp tài nguyên.

Khi tôi đã làm bước 2, ngoại lệ biến mất.


1

Tôi gặp vấn đề này khi tôi thêm một lớp khác vào tệp ngay trước lớp xuất phát từ Biểu mẫu. Thêm nó sau khi sửa lỗi.


1

Ngoài ra, lỗi tương tự có thể xảy ra khi bạn đặt một lớp mới vào mã nguồn của lớp của mẫu thiết kế được tạo.

Lớp mới này có thể được gỡ bỏ và được đặt trong một tệp cs khác.

(Ít nhất trong trường hợp của tôi đây là vấn đề ...)


0

Bởi vì tôi đang biên dịch trước ứng dụng web của mình (sử dụng tính năng xuất bản VS2012). Tôi đã nhận được lỗi ở trên. Tôi đã thử tất cả các đề xuất, nhưng thay đổi một cách kỳ lạ 'Xây dựng hành động' thành 'Nội dung' đã thực hiện thủ thuật!


0

Trong trường hợp của tôi, tôi có một api web với các tài nguyên và tôi tạo một gói nuget từ đó. Khi tôi sử dụng nuget này trong các dự án khác, tôi nhận ra rằng khi tôi yêu cầu api với tài nguyên, tôi nhận được MissingManifestResourceExceptionsau khi tìm kiếm một chút, tôi học được trình đóng gói nuget không tự động đóng gói tài nguyên. Nếu bạn muốn sử dụng các tệp tài nguyên, bạn phải làm điều đó bằng tay. Vì vậy, bạn cần thêm các dòng dưới đây vào tệp .nuspec của mình: (Truy cập https://github.com/NuGet/Home/issues/1482 )

<package> 
    <metadata>
    </metadata>
    <files>
        <file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
        <file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
    </files>
</package>

Nhưng, trước khi thêm tệp, bạn cần chắc chắn phiên bản .net nào bạn đang sử dụng.


0

Tôi đã có một dự án F # mới được tạo. Giải pháp là bỏ chọn "Sử dụng tên tài nguyên tiêu chuẩn" trong thuộc tính dự án -> Ứng dụng -> Tài nguyên / Chỉ định cách quản lý tài nguyên ứng dụng. Nếu bạn không thấy hộp kiểm thì hãy cập nhật Visual Studio của bạn! Tôi đã cài đặt 15.6.7. Trong 15.3.2 hộp kiểm này không có.


0

Chỉ cần đề cập đến. Nếu bạn sử dụng một hằng hoặc bằng chữ, hãy đảm bảo rằng nó đề cập đến một tài nguyên của biểu mẫu ProjectName.Resourcesvà không cpntainResources.resx .

Nó có thể giúp bạn tiết kiệm một hoặc hai giờ.


0

Tôi đã gặp phải vấn đề này với dự án C ++ được quản lý dựa trên WinForms sau khi đổi tên không gian tên toàn cầu (không phải bằng tay, nhưng với công cụ Đổi tên của VS2017).

Giải pháp rất đơn giản, nhưng không được đề cập ở nơi khác.

Bạn phải thay đổi RootNamespacemục nhập trong tập tin vcxproj để phù hợp với không gian tên C ++.


0

Trong trường hợp của tôi, đó là một lỗi đánh máy trong Xaml của một cửa sổ được mở từ Biểu mẫu Winforms:

Sai: <Image Source="/Resources/WorkGreen.gif"/>

Đúng: <Image Source="../Resources/WorkGreen.gif"/> Nó có thể giúp ai đó


-3

Từ trang hỗ trợ của Microsoft :

Sự cố này xảy ra nếu bạn sử dụng tài nguyên cục bộ tồn tại trong cụm vệ tinh mà bạn đã tạo bằng cách sử dụng tệp .resource có tên tệp không phù hợp. Vấn đề này thường xảy ra nếu bạn tự tạo một cụm vệ tinh.

Để khắc phục sự cố này, chỉ định tên tệp của tệp .resource khi bạn chạy Resgen.exe. Trong khi bạn chỉ định tên tệp của tệp .resource, hãy đảm bảo rằng tên tệp bắt đầu bằng tên không gian tên của ứng dụng của bạn. Ví dụ: chạy lệnh sau tại dấu nhắc lệnh Microsoft Visual Studio .NET để tạo tệp .resource có tên không gian tên của ứng dụng của bạn ở đầu tên tệp:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources

1
Cảm ơn phản hồi của bạn, nhưng tôi không biết ResGen.exe là gì, tôi chưa bao giờ sử dụng nó và thật lòng tôi không muốn sử dụng nó vì tôi không cố gắng sử dụng bất cứ thứ gì lạ mắt. Chắc chắn phải có cách khắc phục điều này từ Visual Studio? Ví dụ: vì bạn nói tài nguyên là "cục bộ", làm cách nào để khai báo tài nguyên là không được bản địa hóa? Cảm ơn một lần nữa.
Timwi
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.