Thông báo lỗi 'Không thể tải một hoặc nhiều loại được yêu cầu. Truy xuất thuộc tính LoaderExceptions để biết thêm thông tin. '


347

Tôi đã phát triển một ứng dụng bằng Entity Framework , SQL Server 2000, Visual Studio 2008 và Enterprise Library.

Nó hoạt động hoàn toàn tốt tại địa phương, nhưng khi tôi triển khai dự án vào môi trường thử nghiệm của chúng tôi, tôi gặp phải lỗi sau:

Không thể tải một hoặc nhiều loại được yêu cầu. Truy xuất thuộc tính LoaderExceptions để biết thêm thông tin

Theo dõi ngăn xếp: tại System.Reflection.Module._GetTypesI Internalal (StackCrawlMark & ​​stackMark)

tại System.Reflection.Assugging.GetTypes ()

tại System.Data.Metadata.Edm.ObjectItemCollection.Ass lanhCacheEntry.LoadTypesFromAssugging (bối cảnh LoadingContext)

tại System.Data.Metadata.Edm.ObjectItemCollection.Ass lanhCacheEntry.IternalLoadAss lanhFromCache (bối cảnh LoadingContext)

tại System.Data.Metadata.Edm.ObjectItemCollection.Ass lanhCacheEntry.LoadAss lanhFromCache (Lắp ráp hội đồng, Boolean loadReferencedAssemblies, Dictionary 2 knownAssemblies, Dictionary2 & typeInLoading, List`1 & error)

tại System.Data.Metadata.Edm.ObjectItemCollection.LoadAss lanhFromCache (ObjectItemCollection objectItemCollection, lắp ráp hội đồng, Boolean loadReferencedAssemblies)

tại System.Data.Metadata.Edm.ObjectItemCollection.LoadAssuggingForType (Kiểu loại)

tại System.Data.Metadata.Edm.MetadataWorkspace.LoadAssuggingForType (Kiểu loại, gọi hội nghịAssugging)

tại System.Data.Objects.ObjectContext.CreateQuery [T] (Tham số chuỗi StringString, ObjectParameter [])

Entity Framework dường như có vấn đề, có manh mối nào khắc phục không?


Không có viên đạn ma thuật nào để giải quyết vấn đề này nhưng câu trả lời này sẽ giúp bạn biết lý do rất chính xác stackoverflow.com/a/8824250/185022
AZ_

Câu trả lời:


105

Tôi đã giải quyết vấn đề này bằng cách đặt thuộc tính Copy Local của các tham chiếu của dự án của tôi thành true.


33
Khi chúng ta tiếp tục đi sâu vào các ngoại lệ bên trong cho đến khi chúng ta thấy ngoại lệ của loại ReflectionTypeLoadException và nó có một thuộc tính "LoaderExceptions" cung cấp thông tin về thông tin DLL bị thiếu hoặc không khớp. Sau đó chúng ta có thể chăm sóc các hành động thích hợp từ đó.
Sai

19
tốt, điều đó tốt khi bạn gỡ lỗi từ Visual Studio. Nhưng nếu ứng dụng web của bạn chỉ xuất hiện lỗi này trên máy chủ sản xuất thì sao? ngay cả sau khi bạn đặt thuộc tính Copy Local thành true.
Yousi

2
Đây là một giải pháp cho vấn đề trên máy chủ sản xuất, không phải trên Visual Studio cục bộ. Sao chép Local copy DLL được tham chiếu tại thời điểm xây dựng và DLL được tìm kiếm đầu tiên trong cùng thư mục với ứng dụng đang chạy. Vấn đề có thể tồn tại nếu bạn không sao chép DLL đã được sao chép vào thời gian xây dựng vào thư mục chính xác trên máy chủ sản xuất.
Mentoliptus

Trong trường hợp của tôi, tôi cũng phải thêm một tham chiếu
nuget

530

Lỗi này không có câu trả lời đúng viên đạn ma thuật. Điều quan trọng là có tất cả các thông tin để hiểu vấn đề. Rất có thể một lắp ráp được tải động đang thiếu một lắp ráp được tham chiếu. Việc lắp ráp đó cần phải nằm trong thư mục bin của ứng dụng của bạn.

Sử dụng mã này để xác định những gì còn thiếu.

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}

4
Cảm ơn! Đây phải là một phần của bất kỳ thiết lập ghi nhật ký nào trong các hệ thống sử dụng MEF.
Bogi lenvig

4
Nếu tôi có thể nâng cấp mỗi khi tôi quay lại câu trả lời này, nó sẽ có thêm khoảng 5 lần nâng cấp nữa ... và đếm
s

2
Bạn đã cứu mạng tôi. Cảm ơn bạn rất nhiều. Tôi KHÔNG BAO GIỜ đã tìm thấy vấn đề. Đó là một số dll cũ tôi đã không sử dụng nữa, ẩn sâu trong cấu trúc dự án của tôi và gây ra vấn đề này.
Richard

4
chỉ để tìm ra nhanh những gì còn thiếu, sử dụng throw new Exception(errorMessage);, hy vọng sẽ giúp được ai đó.
shaijut

2
Nếu không có bất kỳ mã bổ sung nào, trong phòng thu trực quan, hãy vào Cài đặt ngoại lệ và đặt vào hộp tìm kiếm TypeLoadException sau đó kích hoạt các hộp kiểm cặp lần truy cập. Ngoài ra, bạn có thể phải vô hiệu hóa trong các tùy chọn trong phần gỡ lỗi "Chỉ là mã của tôi" để bạn có thể bắt ngoại lệ khi xảy ra trong một phụ thuộc mà bạn không viết.
David Burg

56

Một giải pháp hiệu quả với tôi là xóa các thư mục bin / và obj / và xây dựng lại giải pháp.


Tôi đã phải tự xây dựng lại dự án thử nghiệm, không chắc bạn đang tham khảo dự án thử nghiệm ở đây hay dự án bạn đang thử nghiệm.
Jason Axelson

4
Nhận xét lại khác: Nhấp chuột phải vào nút Giải pháp trong "Giải pháp Explorer" và nhấp vào "Giải pháp sạch", sau đó nhấp vào "Giải pháp xây dựng lại". (Nếu có một bổ sung mới trong dự án nguồn của bạn - các dự án khác trong giải pháp của bạn - phần (s), điều này gây ra các thay đổi sẽ được phản ánh thư mục dll dự án của bạn và giải quyết vấn đề này)
Emre Guldogan

Tôi đã có vấn đề này. Theo đề xuất, tôi đã đóng Visual Studio, thư mục bin đã xóa, mở lại dự án và xây dựng lại và nó đã thành công.
Sagar S.

Điều này đã xảy ra khi tôi đang chuyển đổi giữa các chi nhánh với những thay đổi đáng kể. Xóa thùng làm việc. Làm sạch và xây dựng lại KHÔNG hoạt động.
JGTaylor

33

Hai giải pháp khả thi:

  1. Bạn đang biên dịch trong chế độ Phát hành nhưng triển khai một phiên bản đã biên dịch cũ hơn từ thư mục Debug của bạn (hoặc ngược lại).
  2. Bạn chưa cài đặt phiên bản .NET Framework chính xác trong môi trường thử nghiệm của mình.

Tôi đã có cùng một vấn đề, điểm 1 là chính xác đối với tôi. Cảm ơn William.
Matthew

Tôi có cùng một vấn đề ... Tôi đã trải qua cả hai gợi ý và vẫn nhận được cùng một lỗi :(
David Kiff

Nó cũng có thể xảy ra nếu DLL tham chiếu của bạn bị "chặn". Nhấp chuột phải vào nó và chọn "bỏ chặn"
Ben

3
Cũng tìm thấy điều này xảy ra nếu một trong các dự án DLL được thiết lập để xây dựng "x64" thay vì "Bất kỳ CPU".
DCastenholz

# 1 có thể xảy ra nếu cấu hình giải pháp không chính xác - dự án không được chọn để xây dựng, ví dụ sau khi xóa và thêm lại dự án vào giải pháp
lướt

13

Như đã được đề cập trước đây, thường là trường hợp lắp ráp không có ở đó.

Để biết chính xác bạn đang thiếu hội đồng nào, hãy đính kèm trình gỡ lỗi của bạn, đặt điểm dừng và khi bạn thấy đối tượng ngoại lệ, hãy đi sâu vào thuộc tính 'LoaderExceptions'. Việc lắp ráp mất tích nên ở đó.

Hy vọng nó giúp!


1
Ngoài ra, chúng ta có thể tiếp tục tìm hiểu các ngoại lệ bên trong cho đến khi chúng ta thấy ngoại lệ của loại ReflectionTypeLoadException và Nó có một thuộc tính "LoaderExceptions" cung cấp thông tin về thông tin DLL bị thiếu hoặc không khớp.
Sai

2
Trong một giải pháp với nhiều dự án, làm thế nào để chúng tôi thấy dự án nào đang gây ra sự cố trong LoaderExceptions? Tôi thấy rằng System.Web.Mvc không thể được tìm thấy, nhưng tôi không biết dự án nào trong số 20 dự án trong giải pháp này có thể gặp sự cố.
mrcoulson

9

Giải pháp là kiểm tra LoaderException: Trong trường hợp của tôi, một số tệp DLL bị thiếu.

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


6

Đảm bảo rằng bạn cho phép các ứng dụng 32 bit trên IIS nếu bạn đã triển khai lên IIS. Bạn có thể xác định điều này trên cài đặt của Nhóm ứng dụng hiện tại của bạn.


6

Tôi đã gặp lỗi này với ứng dụng ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4.

Nó sẽ hoạt động tốt trên máy phát triển của tôi (Windows Vista 64-bit). Sau đó, khi được triển khai đến máy chủ ( Windows Server 2008 R2 SP1), nó sẽ hoạt động cho đến khi hết thời gian phiên. Vì vậy, chúng tôi đã triển khai ứng dụng và mọi thứ đều ổn và sau đó để nó quá thời gian chờ 20 phút và sau đó lỗi này sẽ được đưa ra.

Để giải quyết nó, tôi đã sử dụng mã này trên blog của Ken Cox để lấy thuộc tính LoaderExceptions.

Đối với tình huống của tôi, DLL bị thiếu là Microsoft.ReportViewer.ProcessingObjectModel(phiên bản 10). DLL này cần được cài đặt trong GAC của máy mà ứng dụng chạy. Bạn có thể tìm thấy nó trong Gói phân phối lại Microsoft Report Viewer 2010 có sẵn trên trang tải xuống của Microsoft.


5

Ban đầu tôi đã thử trình xem nhật ký Fusion, nhưng điều đó không giúp được gì nên cuối cùng tôi đã sử dụng WinDbg với tiện ích mở rộng SOS.

! dumpheap -stat -type Ngoại lệ / D

Sau đó, tôi đã kiểm tra FileNotFoundExceptions. Thông báo trong trường hợp ngoại lệ chứa tên của DLL đang tải.

NB, / D cung cấp cho bạn kết quả siêu liên kết, vì vậy hãy nhấp vào liên kết trong bản tóm tắt cho FileNotFoundException. Điều đó sẽ đưa ra một danh sách các trường hợp ngoại lệ. Sau đó nhấp vào liên kết cho một trong những trường hợp ngoại lệ. Điều đó sẽ! Dumpobject mà ngoại lệ. Sau đó, bạn chỉ cần có thể nhấp vào liên kết cho Tin nhắn trong đối tượng ngoại lệ và bạn sẽ thấy văn bản.



4

Ví dụ của tôi về vấn đề này đã kết thúc là một tài liệu tham khảo bị thiếu. Một hội đồng đã được đề cập đến trong app.config nhưng không có tài liệu tham khảo trong dự án.


3

Nếu bạn đang sử dụng Entity Framework , hãy thử sao chép các tham chiếu sau cục bộ.

  • System.Data.Entity
  • System.Web.Entity

Thay đổi thuộc tính "Sao chép cục bộ" thành "Đúng" cho các tham chiếu và xuất bản này.


3

Một giải pháp khác để biết tại sao chính xác không có gì hoạt động (từ Microsoft kết nối):

  1. Thêm mã này vào dự án:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. Tắt lắp ráp nối tiếp thế hệ.

  3. Xây dựng và thực hiện.

2

Tôi đã có một ứng dụng web .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 được phát triển trong Visual Studio 2010. Tôi gặp vấn đề tương tự, nó hoạt động trên một máy chủ Windows Server 2008 R2 nhưng không phải trên máy chủ Windows Server 2008 R2 khác, mặc dù các phiên bản .NET và ASP.NET MVC giống nhau, nhưng cũng có lỗi tương tự như của bạn.

Tôi đã đi theo đề xuất của miko, vì vậy tôi đã cài đặt Windows SDK v7.1 (x64) trên máy chủ bị lỗi, vì vậy tôi có thể chạy! Dumpheap.

Chà, hóa ra việc cài đặt Windows SDK v7.1 (x64) đã giải quyết được vấn đề. Bất cứ sự phụ thuộc nào bị thiếu phải được đưa vào SDK. Nó có thể được tải xuống từ Microsoft Windows SDK cho Windows 7 và .NET Framework 4 .


2

Thêm vấn đề / giải pháp cụ thể của tôi vào đây vì đây là kết quả đầu tiên cho thông báo lỗi này. Trong trường hợp của tôi, lỗi đã nhận được khi tôi triển khai một ứng dụng thứ hai trong thư mục của ứng dụng đầu tiên của tôi trong IIS . Cả hai đều xác định chuỗi kết nối có cùng tên dẫn đến ứng dụng con có xung đột và lần lượt tạo ra thông báo lỗi không rõ ràng này (với tôi). Nó đã được giải quyết bằng cách thêm:

<clear/>

trong khối chuỗi kết nối của ứng dụng web con đã ngăn không cho nó kế thừa chuỗi kết nối của tệp web.config cao hơn trong cấu trúc phân cấp, do đó, nó trông giống như:

<connectionStrings>
  <clear/>
  <add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>

Một câu hỏi Stack Overflow tham chiếu đã giúp một khi tôi xác định được những gì đang diễn ra là liệu một ứng dụng con có kế thừa từ web.config không? .


2

Điều này làm việc cho tôi. Thêm nó vào web.config của bạn

<system.web>
  <trust level="Full" />

Tôi đã gặp lỗi này:It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

2

Vấn đề của tôi đã được giải quyết sau khi tôi xóa các tập tin lắp ráp dự phòng khỏi binthư mục.


2

Trong trường hợp không có câu trả lời nào khác giúp bạn:

Khi tôi gặp vấn đề này, hóa ra dịch vụ Windows của tôi được xây dựng cho nền tảng x64 và tôi đã vô tình chạy phiên bản 32 bit của InstallUtil.exe. Vì vậy, hãy đảm bảo bạn đang sử dụng đúng phiên bản InstallUtil cho nền tảng bạn đã xây dựng.


Tôi đã có một vấn đề tương tự. Một số DLL mà dịch vụ của tôi đang sử dụng được biên dịch cho bộ xử lý 32 bit, được đổi thành bất kỳ bộ xử lý nào và hiện tại nó hoạt động.
Blake Thingstad

1

Các đề xuất khác đều tốt. Trong trường hợp của tôi, vấn đề là hộp nhà phát triển là máy 64 bit sử dụng vị trí x86 của các API khác nhau, bao gồm cả Silverlight .

Bằng cách thay đổi nền tảng đích để phù hợp với máy chủ 32 bit nơi ứng dụng web đang được triển khai đã loại bỏ phần lớn các lỗi liên quan đến việc không thể tải một hoặc nhiều loại được yêu cầu.


1

Tôi đã thay đổi Thuộc tính Phiên bản cụ thể của Chuyển hướng thành sai và điều đó đã giúp.


1

Tôi đã có thông báo lỗi tương tự được báo cáo khi biên dịch gói Visual Studio (VSPackage). Toàn bộ giải pháp biên dịch và lỗi được đưa ra khi gói được tạo bởi CreatPkgDef. Phải nói rằng, rõ ràng là tôi không thể bắt được LoaderExceptions vì đây không phải là ứng dụng của tôi ném nó, mà là công cụ của chính Microsoft. (Mặc dù tôi chịu trách nhiệm về sự nhầm lẫn của CreatPkgDef.)

Trong trường hợp của tôi, nguyên nhân cốt lõi là giải pháp của tôi tạo ra MyDll.dll đã được đăng ký với GAC (và chúng khác nhau), do đó, CreatPgkDef đã nhầm lẫn nên sử dụng cái nào và nó đã quyết định chỉ đưa ra một lỗi không phải là ' t thực sự hữu ích MyDll.dll trong GAC đã được đăng ký bởi trình cài đặt của cùng một sản phẩm (rõ ràng là phiên bản trước đó, với / hơi / nội dung khác nhau).

Cách khắc phục

  1. Cách ưa thích: Đảm bảo bạn sử dụng phiên bản chính xác của MyDll.dll
    1. Khi biên dịch dự án của bạn, đảm bảo bạn sử dụng số phiên bản khác với số bạn đã sử dụng trong phiên bản trước nằm trong GAC. Đảm bảo các thuộc tính sau là chính xác:
      • [assembly: AssemVersion ("1.0.0.1")] // Giả sử tệp DLL cũ đã được phiên bản 1.0.0.0
      • [assembly: AssociationFileVersion ("1.0.0.1")] // Giả sử tệp DLL cũ đã được phiên bản 1.0.0.0
    2. Nếu cần, chỉ định tên lắp ráp đủ điều kiện (ví dụ: "MyDll.dll, Version = 1.0.0.1, Culture = trung tính, PublicKeyToken = 1234567890abcdef") khi bạn tham chiếu nó trong các dự án khác của mình.
  2. Nếu cách trên không thành công: Bạn có thể gỡ cài đặt MyDll.dll cũ khỏi GAC
    1. Cách gỡ cài đặt hội từ GAC
    2. Gỡ cài đặt ứng dụng bao gồm MyDll.dll

Thay đổi lắp ráp là đủ tốt cho tôi. :)

Tôi hy vọng nó sẽ có ích.


1

Tôi đã gặp vấn đề tương tự (nhưng tại địa phương của tôi) khi tôi đang cố gắng thêm di chuyển Entity Framework với Gói quản lý gói.

Cách tôi giải quyết là bằng cách tạo một ứng dụng bảng điều khiển trong đó Main () có mã sau:

 var dbConfig = new Configuration();
 var dbMigrator = new DbMigrator(dbConfig);
 dbMigrator.Update();

Hãy chắc chắn rằng lớp Cấu hình là Cấu hình di chuyển của dự án thất bại của bạn. Bạn sẽ cần System.Data.Entity.Migations để sử dụng DbMigrator.

Đặt điểm dừng trong ứng dụng của bạn và chạy nó. Visual Studio nên bắt ngoại lệ (trừ khi bạn có loại ngoại lệ đó được đặt để không phá vỡ phiên gỡ lỗi) và bạn sẽ có thể tìm thấy thông tin bạn đang tìm kiếm.

Tài liệu tham khảo còn thiếu trong trường hợp của tôi là EFProviderWrapperToolkit.


1

Tôi gặp vấn đề này khi tôi cài đặt gói NuGet trên một trong các dự án và quên cập nhật dự án khác.

Tôi đã giải quyết điều này bằng cách làm cho cả hai dự án có cùng một tham chiếu lắp ráp.


Cảm ơn các liên kết! Tôi không biết NuGet là gì.
jebar8

1

Nó cũng xảy ra với tôi. Tôi đã giải quyết vấn đề như sau: Nhấp chuột phải vào Giải pháp, Quản lý Gói NuGet cho Giải pháp ... Hợp nhất các gói và nâng cấp các gói thành cùng một phiên bản.


0

Đặt chế độ IIS 32 bit thành true, chế độ gỡ lỗi thành true trong tệp cấu hình, xóa tempthư mục và đặt lại IIS khắc phục sự cố theo thời gian và nó sẽ quay lại sau một thời gian.


0

Xác minh rằng mỗi dự án của bạn được thiết lập chính xác trong Trình quản lý cấu hình .

Tương tự như lý do của William Edmondson về vấn đề này, tôi đã chuyển cài đặt Trình quản lý cấu hình của mình từ "Gỡ lỗi" "Bất kỳ CPU" sang "Gỡ lỗi" ".NET". Vấn đề là phiên bản ".NET" KHÔNG được cấu hình để xây dựng TẤT CẢ các dự án, vì vậy một số DLL của tôi đã lỗi thời (trong khi các phiên bản khác hiện tại). Điều này gây ra nhiều vấn đề với việc bắt đầu ứng dụng.

Cách khắc phục tạm thời là thực hiện đề xuất của Kenny Eliasson để xóa các thư mục \ bin và \ obj. Tuy nhiên, ngay khi tôi thực hiện nhiều thay đổi hơn cho các dự án không biên dịch, mọi thứ sẽ lại thất bại.


0

Tôi cũng gặp vấn đề này khi tạo bổ trợ Microsoft Word mới với Visual Studio 2015. Vấn đề là về việc tôi có 2 phiên bản MS Office, 2013 và 2016. Tôi gỡ cài đặt MS Office 2013 và sau đó nó hoạt động.


0

Tôi xây dựng một vài dự án cho SharePoint và, tất nhiên, đã triển khai chúng. Một lần nó đã xảy ra.

Tôi đã tìm thấy một hội đồng cũ trong C: \ Windows \ assembly \ temp \ xxx (với FarManager), đã gỡ bỏ nó sau khi khởi động lại và tất cả các dự án được xây dựng.

Tôi có câu hỏi cho MSBuild, bởi vì trong các hội đồng dự án được liên kết như các dự án và mọi hội đồng được đánh dấu là "Sao chép cục bộ", nhưng không phải từ GAC.


0

Tôi có thể khắc phục sự cố này bằng cách đánh dấu "Sao chép cục bộ = Đúng" trên tất cả các tệp DLL được tham chiếu trong dự án, xây dựng lại và triển khai trên máy chủ thử nghiệm.


0

Tôi đã có một vấn đề với automap. Trong binthư mục, tệp automap.4net.dll có ở đó, nhưng vì một số lý do, automap.xml và automap.dll không. Sao chép chúng vào binthư mục đã giải quyết vấn đề.

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.