Không thể tải loại do lỗi lắp ráp


120

Tôi đã viết một bài kiểm tra đơn giản sau đây để cố gắng học Giao diện Thông thạo của Castle Windsor:

using NUnit.Framework;
using Castle.Windsor;
using System.Collections;
using Castle.MicroKernel.Registration;

namespace WindsorSample {
    public class MyComponent : IMyComponent {
        public MyComponent(int start_at) {
            this.Value = start_at;
        }
        public int Value { get; private set; }
    } 
    public interface IMyComponent {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture {
        [Test]
        public void ResolvingConcreteImplShouldInitialiseValue() {
            IWindsorContainer container = new WindsorContainer();
            container.Register(Component.For<IMyComponent>().ImplementedBy<MyComponent>().Parameters(Parameter.ForKey("start_at").Eq("1")));
            IMyComponent resolvedComp = container.Resolve<IMyComponent>();
            Assert.AreEqual(resolvedComp.Value, 1); 
        }
    }
}

Khi tôi thực hiện kiểm tra thông qua TestDriven.NET, tôi gặp lỗi sau:

System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'.
at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue()

Khi tôi thực hiện kiểm tra thông qua NUnit GUI, tôi nhận được:

WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue:
System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.

Nếu tôi mở Assembly mà tôi đang tham chiếu trong Reflector, tôi có thể thấy thông tin của nó là:

Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc

và nó chắc chắn chứa Castle.MicroKernel.Registration.IRegistration

Điều gì có thể xảy ra?

Tôi nên đề cập rằng các tệp nhị phân được lấy từ bản dựng mới nhất của Castle mặc dù tôi chưa bao giờ làm việc với nant nên tôi không bận tâm đến việc biên dịch lại từ nguồn và chỉ lấy các tệp trong thư mục bin. Tôi cũng nên chỉ ra rằng dự án của tôi biên dịch không có vấn đề gì.

Câu trả lời:


111

Có phải assembly trong Global Assembly Cache (GAC) hoặc bất kỳ nơi nào có thể đang ghi đè assembly mà bạn nghĩ đang được tải không? Điều này thường là kết quả của việc một lắp ráp không chính xác được tải, đối với tôi, điều đó có nghĩa là tôi thường có thứ gì đó trong GAC ghi đè phiên bản tôi có trong bin / Debug.


1
Tôi đã thêm các tập hợp bằng cách duyệt đến các tệp dll, vì vậy GAC sẽ không nhập vào phương trình. Đồng thời, nhấn chuột phải vào hội-> mở trong phản xạ từ cửa sổ solution explorer mang lại nó lên trong phản xạ với tất cả các thông tin mà tôi mong chờ
George Mauer

7
Bạn đã thêm nó như thế nào không quan trọng nếu một assembly có cùng tên / phiên bản tồn tại trong GAC, nó sẽ tải một assembly đó.
Eric Schoonover 24-08

1
VS.NET sẽ liệt kê đường dẫn đến hợp ngữ bạn chọn và phản xạ sẽ mở hợp ngữ phù hợp nhưng khi ứng dụng thực thi thời gian chạy .NET sẽ tải hợp ngữ GAC'd.
Eric Schoonover 24-08

11
Đây là lần thứ hai câu trả lời này đã cứu mông tôi. Tôi sẽ bỏ phiếu lại nếu tôi có thể.
whybird

17
(Gak nói nó out loud Âm thanh rất của tên cảnh báo cho bạn về những gì nó là như thế nào...)
whybird

131

Nếu bạn có một dự án tham chiếu đến một dự án khác (chẳng hạn như loại 'Ứng dụng Windows' tham chiếu đến 'Thư viện lớp') và cả hai đều có cùng tên Assembly, bạn sẽ gặp lỗi này. Bạn có thể đặt tên mạnh mẽ cho dự án được tham chiếu hoặc (thậm chí tốt hơn) đổi tên tập hợp của dự án tham chiếu (trong tab 'Ứng dụng' của thuộc tính dự án trong VS).


Ngoài ra: cố gắng dọn dẹp thư mục đầu ra. Có thể, đổi tên thư viện có thể gây ra cùng một vấn đề, vì cả hai (cũ và mới) sẽ được đặt trong cùng một thư mục đầu ra.
Manushin Igor

Nếu bạn cắt + dán một dự án và không chỉnh sửa chính xác tất cả các trường, nó có thể dẫn đến vấn đề này!
Michael Parker

1
Đây là nó cho tôi, tôi đã tham chiếu Assembly trong thư viện lớp tham chiếu. Tôi phải truy cập tệp web.config của dự án web của mình và xóa tham chiếu <dependantAssembly> sau khi gỡ cài đặt gói trong nuGet để làm cho nó hoạt động.
Ivan

16

Giải pháp cho điều này đối với tôi không được đề cập ở trên, vì vậy tôi nghĩ tôi sẽ thêm câu trả lời của mình vào đuôi dài ...

Tôi đã kết thúc bằng một tham chiếu cũ đến một lớp (an HttpHandler) trong web.config không còn được sử dụng (và không còn là tham chiếu hợp lệ). Vì một số lý do mà nó đã bị bỏ qua khi chạy trong Studio (hoặc có thể tôi vẫn có thể truy cập lớp đó trong thiết lập nhà phát triển của mình?) Và vì vậy tôi chỉ gặp lỗi này sau khi thử triển khai lên IIS. Tôi đã tìm kiếm tên assembly trong web.config, xóa tham chiếu trình xử lý không sử dụng, sau đó lỗi này biến mất và mọi thứ hoạt động tốt. Hy vọng điều này sẽ giúp người khác.


1
Có một cái gì đó rất giống nhau, chỉ khác là tham chiếu web.config đến DLL vẫn được triển khai trong thư mục bin. Đến lượt mình, tệp nhị phân này lại tham chiếu đến một phiên bản cũ của một DLL được chia sẻ gây ra ngoại lệ.
santos

10

Tôi đã gặp vấn đề tương tự và đối với tôi nó không liên quan gì đến không gian tên hoặc đặt tên dự án.

Nhưng như một số người dùng gợi ý rằng nó phải làm với một lắp ráp cũ vẫn đang được tham chiếu.

Tôi khuyên bạn nên xóa tất cả các thư mục "bin" / nhị phân của tất cả các dự án và xây dựng lại toàn bộ giải pháp. Điều này đã loại bỏ mọi tập hợp có khả năng lỗi thời và sau đó MEF đã xuất tất cả các plugin của tôi mà không gặp vấn đề gì.


8

Tôi đã gặp lỗi này và không có gì tôi tìm thấy trên StackOverflow hoặc nơi khác đã giải quyết được nó, nhưng câu trả lời của bmoeskau cho câu hỏi này đã chỉ cho tôi đúng hướng để khắc phục, điều này vẫn chưa được đề cập dưới dạng câu trả lời. Câu trả lời của tôi không hoàn toàn liên quan đến câu hỏi ban đầu, nhưng tôi đăng nó ở đây với giả định rằng ai đó gặp vấn đề này sẽ tìm thấy cách ở đây thông qua tìm kiếm trên Google hoặc một cái gì đó tương tự (như bản thân tôi một tháng kể từ khi điều này lại khiến tôi đau đầu , cãi!).

Assembly của tôi nằm trong GAC, vì vậy về mặt lý thuyết chỉ có một phiên bản của assembly. Ngoại trừ IIS đang lưu trữ hữu ích phiên bản cũ và cho tôi lỗi này. Tôi vừa thay đổi, xây dựng lại và cài đặt lại lắp ráp trong GAC. Một giải pháp khả thi là sử dụng Task Manager để diệt w3wp.exe . Điều này buộc IIS phải đọc lại assembly từ GAC: sự cố đã được giải quyết.


3

Phiên bản = 1.0.3.0 chỉ ra Castle RC3, tuy nhiên giao diện thông thạo đã được phát triển vài tháng sau khi phát hành RC3. Do đó, có vẻ như bạn gặp sự cố lập phiên bản. Có thể bạn đã đăng ký Castle RC3 trong GAC và nó đang sử dụng ...


Thật thú vị, tôi nhận được bản dựng mới nhất ở đây: build.castleproject.org/cruise/DownloadBuild.castle?number=956 Đó là những gì họ đề xuất trên diễn đàn của họ. Ngoài ra, nếu đó là trường hợp tôi tưởng tượng rằng dự án sẽ không biên dịch chút nào. Nhưng điều này biên dịch không có vấn đề
George Mauer

Khi các con đã phiên bản trong GAC, tôi có lẽ làm, nhưng tôi không thêm tài liệu tham khảo từ GAC và sử dụng phản xạ trên tham chiếu chỉ ra rằng nó là một trong tôi nghĩ
George Mauer

Hãy thử xóa cụm trùng lặp khỏi GAC, tôi sẵn sàng cho rằng đó là vấn đề của bạn.
Eric Schoonover

3

Tôi thỉnh thoảng nhận được điều này và nó luôn luôn gặp khó khăn trong việc lắp ráp trong GAC


3

Nếu lỗi này do thay đổi không gian tên gây ra, hãy đảm bảo rằng thư mục của dự án đó được đổi tên thành cùng tên và đóng VS.NET Chỉnh sửa dự án có sự cố với Notepad và thay thế các nút ở đó

"RootNamespace> New_Name_Of_Folder_Of_Your_Project_Namespace" RootNamespace> "AssemblyName> New_Name_Of_Folder_Of_Your_Project_Namespace" AssemblyName>


3

Xóa tệp .pdb của tôi cho dll đã giải quyết được vấn đề này cho tôi. Tôi đoán nó có liên quan đến thực tế là dll được tạo bằng ILMerge.


Đây là nó cho tôi! Tôi không biết ILMerge là gì nhưng Epicor không thích có tệp pdb bên cạnh assembly của tôi.
MDave

Không có ILMerge, nhưng xóa tất cả các tệp PDB đã giải quyết vấn đề.
hogarth45

3

Khi tôi gặp sự cố như vậy, tôi thấy công cụ FUSLOGVW rất hữu ích. Nó đang kiểm tra thông tin liên kết lắp ráp và ghi lại nó cho bạn. Đôi khi các thư viện bị thiếu, đôi khi GAC có các phiên bản khác nhau đang được tải. Đôi khi nền tảng của các thư viện được tham chiếu gây ra sự cố. Công cụ này làm rõ cách các ràng buộc của phụ thuộc đang được giải quyết và điều này thực sự có thể giúp bạn điều tra / gỡ lỗi vấn đề của mình.

Fusion Log Viewer / fuslogvw / Assembly Binding Log Viewer. Kiểm tra thêm / tải xuống tại đây: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx .


Có cách nào để làm cho FUSLOGVW hoạt động với Visual Studio Designer không? Visual Studio Designer đưa ra một ngoại lệ khi tôi cố gắng chỉnh sửa một trong các hộp thoại của mình ("Không tìm thấy phương pháp"), cho một phương pháp mà tôi biết là tồn tại (ứng dụng chạy tốt). Theo như tôi thấy, không có gì hiển thị trong FUSLOGVW khi chỉnh sửa nội dung nào đó trong Visual Studio Designer.
Jimmy

3

Tôi đã gặp sự cố này sau khi bao gồm tên lớp:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

Việc dừng IIS và xóa nội dung trong Temporary ASP.NET Filesđó đã sửa nó cho tôi.

Đang triển khai dự án của bạn (phiên bản 32 / 64bit, .net, v.v.) thì đúng là Temporary ASP.NET Fileskhác nhau:

  • 64 bit
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 bit
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • Trên máy nhà phát triển của tôi, nó là (Bởi vì có thể là IIS Express?)
    %temp%\Temporary ASP.NET Files

3

Có thể không có khả năng xảy ra, nhưng đối với tôi, nguyên nhân là do ứng dụng của tôi đang cố tải một thư viện có cùng tên lắp ráp (xxx.exe tải xxx.dll).


2

Chỉ cần gặp phải vấn đề này với một nguyên nhân khác:

đang chạy thử nghiệm đơn vị trong chế độ phát hành nhưng thư viện đang được tải là phiên bản chế độ gỡ lỗi chưa được cập nhật


2

Tuy nhiên, một giải pháp khác: Các tệp DLL cũ trỏ đến nhau và được Visual Studio lưu vào bộ nhớ cache trong

C:\Users\[yourname]\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies

Thoát VS, xóa mọi thứ trong thư mục này và Bob là chú của bạn.


2

Tôi gặp vấn đề tương tự. Tôi vừa giải quyết vấn đề này bằng cách cập nhật lắp ráp qua GAC.

Để sử dụng gacutil trên máy phát triển, hãy truy cập: Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010) .

Tôi đã sử dụng các lệnh này để gỡ cài đặt và Cài đặt lại tương ứng.

gacutil /u myDLL

gacutil /i "C:\Program Files\Custom\mydllname.dll"

Lưu ý: Tôi chưa gỡ cài đặt dll của mình trong trường hợp của tôi, tôi vừa cập nhật dll với đường dẫn hiện tại.


2

Tôi đã gặp phải trường hợp này khi cố gắng tải một loại (thông qua phản chiếu) trong một hợp ngữ được xây dựng dựa trên phiên bản khác của tham chiếu chung cho ứng dụng mà lỗi này xuất hiện.

Vì tôi chắc chắn rằng kiểu không thay đổi trong cả hai phiên bản của assembly, nên tôi đã kết thúc việc tạo một trình giải quyết assembly tùy chỉnh ánh xạ cụm bị thiếu đến một phiên bản mà ứng dụng của tôi đã tải. Cách đơn giản nhất là thêm một phương thức khởi tạo tĩnh vào lớp chương trình như sau:

using System.Reflection
static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "<AssemblyName>")
        {
            // Load assembly from startup path
            return Assembly.LoadFile($"{Application.StartupPath}\\<AssemblyName>.dll");
        }
        else
        {
            return null;
        }
    };
}

Điều này tất nhiên giả định rằng Assembly nằm trong đường khởi động của ứng dụng và có thể dễ dàng điều chỉnh.


Tôi nên lưu ý rằng giải pháp này áp dụng cho các trường hợp bạn đang cung cấp các bản lắp ráp của mình cho các bên thứ ba và không thể đảm bảo mọi người cập nhật đúng lúc khi bạn làm. Nếu không, nên biên dịch lại với các tài liệu tham khảo đã hiệu chỉnh.
JBartlau,

2

Chỉ cần gặp phải vấn đề này với một nguyên nhân khác:

Tôi đang sử dụng một hội đồng hợp nhất được tạo bằng ILRepack. Hợp ngữ bạn đang truy vấn các loại từ phải là hội đầu tiên được chuyển đến ILRepack nếu không các loại của nó sẽ không khả dụng.



1

Điều này thường xảy ra khi bạn đã triển khai một phiên bản hợp ngữ của mình trong GAC nhưng chưa được cập nhật các lớp mới mà bạn có thể đã thêm vào hợp ngữ trên IDE của mình. Do đó, hãy đảm bảo rằng assembly trên GAC được cập nhật những thay đổi mà bạn có thể đã thực hiện trong dự án của mình.

Ví dụ: nếu bạn có Thư viện Lớp Chung và trong Thư viện Lớp đó, bạn có kiểu Common.ClassA và triển khai kiểu này cho GAC được đặt tên mạnh. Bạn đến sau và thêm một loại khác có tên Common.ClassB và bạn chạy mã trên IDE của mình mà không cần triển khai các thay đổi bạn đã thực hiện đối với GAC of Common với loại Common.ClassB mới được thêm vào.


1

Tôi gặp lỗi tương tự sau khi cập nhật một dll được tham chiếu trong một dự án thực thi trên máy tính để bàn. Vấn đề là như những người ở đây đã đề cập liên quan đến một tài liệu tham khảo cũ và đơn giản để sửa chữa nhưng chưa được đề cập ở đây, vì vậy tôi nghĩ nó có thể tiết kiệm thời gian của người khác.

Dù sao thì tôi đã cập nhật dll A và gặp lỗi từ một dll được tham chiếu khác, hãy gọi nó là B ở đây nơi dll A có tham chiếu đến dll B.

Cập nhật dll B đã khắc phục sự cố.


1

Thêm DLL của bạn vào GAC (bộ nhớ cache lắp ráp toàn cầu)

Visual Studio Command Prompt => Chạy với tư cách Quản trị viên

gacutil / i "đường dẫn tệp dll"

Bạn có thể thấy lắp ráp được thêm vào C: \ Windows \ system32 \

Nó cũng sẽ giải quyết việc thiếu dll hoặc "Không thể tải tệp hoặc lắp ráp" trong tác vụ Tập lệnh SSIS


1
Tôi sẽ lưu ý rằng thêm nhiều thứ vào GAC thường là một ý tưởng tồi, khiến việc triển khai khó khăn hơn và nói chung là điều mà ngay cả microsoft cũng đang lùi bước.
George Mauer

1

Tôi đã gặp sự cố tương tự trong Visual Studio 2017 khi sử dụng MSTest làm khung thử nghiệm. Tôi đã nhận được ngoại lệ System.TypeLoadException khi chạy một số (không phải tất cả) bài kiểm tra đơn vị, nhưng các bài kiểm tra đơn vị đó sẽ vượt qua khi được gỡ lỗi. Cuối cùng tôi đã làm những điều sau đây để giải quyết vấn đề:

  1. Mở tệp Local.testsettings trong giải pháp
  2. Đi tới cài đặt "Kiểm tra đơn vị"
  3. Bỏ chọn "Sử dụng bối cảnh tải cho các hội đồng trong thư mục thử nghiệm." hộp kiểm

Sau khi thực hiện các bước này, tất cả các bài kiểm tra đơn vị bắt đầu vượt qua khi chạy.


1

Tôi đã trải nghiệm tương tự như trên sau khi loại bỏ ký kết các cụm trong giải pháp. Các dự án sẽ không xây dựng.

Tôi nhận thấy rằng một trong các dự án đã tham chiếu đến gói StrongNamer NuGet, gói này sửa đổi quy trình xây dựng và cố gắng ký các gói Nuget không có chữ ký.

Sau khi gỡ bỏ gói StrongNamer, tôi đã có thể xây dựng lại dự án mà không cần ký / đặt tên mạnh cho các tổ hợp.


0

Nếu đây là ứng dụng Windows, hãy thử kiểm tra bản sao trong Global Assembly Cache (GAC). Có gì đó đang ghi đè phiên bản bin / gỡ lỗi của bạn.

Nếu đây là một ứng dụng web, bạn có thể phải xóa trên máy chủ và tải lên lại. Nếu bạn đang xuất bản, bạn có thể muốn chọn hộp kiểm Xóa tất cả các tệp hiện có trước khi xuất bản. Tùy thuộc vào phiên bản Visual Studio, nó sẽ nằm trong Publish> Settings> File Publish Options Xóa tất cả các tệp hiện có trước khi xuất bản


-2

Tôi chỉ giải quyết vấn đề này bằng cách chạy lệnh iisreset bằng cách sử dụng dấu nhắc lệnh ... Luôn là điều đầu tiên tôi làm khi gặp lỗi như vậy.


4
Tôi xin lỗi nhưng điều này không liên quan gì đến câu hỏi, đưa ra các giả định về việc sử dụng iis và không giải thích điều gì đang xảy ra để gây ra sự cố.
George Mauer
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.