Tidak dapat memuat jenis dari kesalahan perakitan

120

Saya telah menulis tes sederhana berikut dalam mencoba mempelajari Antarmuka Lancar 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); 
        }
    }
}

Ketika saya menjalankan tes melalui TestDriven.NET saya mendapatkan kesalahan berikut:

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()

Ketika saya menjalankan tes melalui NUnit GUI saya mendapatkan:

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.

Jika saya membuka Majelis yang saya rujuk di Reflektor, saya dapat melihat informasinya adalah:

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

dan itu pasti berisi Castle.MicroKernel.Registration.IRegistration

Apa yang sedang terjadi?

Saya harus menyebutkan bahwa binari diambil dari build Castle terbaru meskipun saya belum pernah bekerja dengan nant jadi saya tidak repot-repot melakukan kompilasi ulang dari sumber dan hanya mengambil file di direktori bin. Saya juga harus menunjukkan bahwa proyek saya dapat dikompilasi tanpa masalah.

George Mauer
sumber

Jawaban:

111

Apakah assembly ada di Global Assembly Cache (GAC) atau di mana pun yang mungkin menimpa assembly yang menurut Anda sedang dimuat? Ini biasanya hasil dari perakitan yang salah sedang dimuat, bagi saya itu berarti saya biasanya memiliki sesuatu di GAC yang menggantikan versi yang saya miliki di bin / Debug.

Eric Schoonover
sumber
1
Saya menambahkan rakitan dengan menelusuri file dll, jadi GAC tidak boleh masuk ke dalam persamaan. Juga klik kanan pada rakitan-> buka di reflektor dari penjelajah solusi memunculkannya di reflektor dengan semua informasi yang saya harapkan
George Mauer
7
Tidak masalah bagaimana Anda menambahkannya jika rakitan dengan nama / versi yang sama ada di GAC, ia akan memuat yang itu.
Eric Schoonover
1
VS.NET akan mencantumkan jalur ke rakitan yang Anda pilih dan reflektor akan membuka rakitan yang benar tetapi ketika aplikasi menjalankan runtime .NET akan memuat rakitan GAC.
Eric Schoonover
11
Ini adalah kedua kalinya jawaban ini menyelamatkan pantat saya. Saya akan memilihnya lagi jika saya bisa.
whybird
17
(GAK. Ucapkan dengan lantang. Bunyi namanya memperingatkan Anda seperti apa.)
whybird
131

Jika Anda memiliki satu proyek yang mereferensikan proyek lain (seperti jenis 'Aplikasi Windows' yang merujuk pada 'Perpustakaan Kelas') dan keduanya memiliki nama Majelis yang sama, Anda akan mendapatkan kesalahan ini. Anda dapat memberi nama kuat proyek yang direferensikan atau (bahkan lebih baik) mengganti nama rakitan proyek referensi (di bawah tab 'Aplikasi' pada properti proyek di VS).

AndrewS
sumber
Selain itu: coba bersihkan folder keluaran. Mungkin, penggantian nama perpustakaan dapat menyebabkan masalah yang sama, karena keduanya (lama dan baru) akan ditempatkan di folder keluaran yang sama.
Manushin Igor
Jika Anda memotong + menempelkan proyek dan tidak mengedit semua bidang dengan benar, ini dapat menyebabkan masalah ini!
Michael Parker
1
Ini untuk saya, saya telah mereferensikan Majelis di perpustakaan kelas yang dirujuk. Saya harus masuk ke file web.config proyek web saya dan menghapus referensi <dependantAssembly> setelah menghapus paket di nuGet untuk membuatnya berfungsi.
Ivan
16

Solusi untuk ini untuk saya tidak disebutkan di atas, jadi saya pikir saya akan menambahkan jawaban saya ke ekor panjang ...

Saya akhirnya memiliki referensi lama ke kelas (an HttpHandler) di web.config yang tidak lagi digunakan (dan tidak lagi merupakan referensi yang valid). Untuk beberapa alasan itu diabaikan saat berjalan di Studio (atau mungkin saya memiliki kelas itu masih dapat diakses dalam pengaturan dev saya?) Dan jadi saya hanya mendapat kesalahan ini setelah saya mencoba menerapkan ke IIS. Saya mencari nama assembly di web.config, menghapus referensi penangan yang tidak digunakan, kemudian kesalahan ini hilang dan semuanya berfungsi dengan baik. Semoga ini bisa membantu orang lain.

Brian Moeskau
sumber
1
Memiliki sesuatu yang sangat mirip, satu-satunya perbedaan adalah referensi web.config ke DLL masih digunakan di direktori bin. Biner ini, pada gilirannya, merujuk pada versi lama DLL bersama yang menyebabkan pengecualian.
santos
10

Saya memiliki masalah yang sama dan bagi saya itu tidak ada hubungannya dengan namespace atau penamaan proyek.

Tapi seperti yang diisyaratkan oleh beberapa pengguna itu ada hubungannya dengan rakitan lama yang masih dirujuk.

Saya sarankan untuk menghapus semua folder "bin" / biner dari semua proyek dan membangun kembali seluruh solusi. Ini menghapus semua rakitan yang berpotensi ketinggalan zaman dan setelah itu MEF mengekspor semua plugin saya tanpa masalah.

Matthias Wolf
sumber
8

Saya mendapatkan kesalahan ini dan tidak ada yang saya temukan di StackOverflow atau di tempat lain yang menyelesaikannya, tetapi jawaban bmoeskau untuk pertanyaan ini mengarahkan saya ke arah yang benar untuk perbaikan, yang belum disebutkan sebagai jawaban. Jawaban saya tidak sepenuhnya terkait dengan pertanyaan asli, tetapi saya mempostingnya di sini dengan asumsi bahwa seseorang yang memiliki masalah ini akan menemukannya di sini melalui pencarian Google atau yang serupa (seperti saya satu bulan dari sekarang ketika ini menggigit saya lagi , arg!).

Perakitan saya ada di GAC, jadi secara teoritis hanya ada satu versi perakitan yang tersedia. Kecuali IIS membantu menyimpan versi lama dan memberi saya kesalahan ini. Saya baru saja mengubah, membangun kembali dan menginstal ulang perakitan di GAC. Salah satu solusi yang mungkin adalah menggunakan Task Manager untuk mematikan w3wp.exe . Ini memaksa IIS untuk membaca ulang perakitan dari GAC: masalah terpecahkan.

Michael Maddox
sumber
3

Versi = 1.0.3.0 menunjukkan Castle RC3, namun antarmuka yang lancar dikembangkan beberapa bulan setelah rilis RC3. Oleh karena itu, tampaknya Anda mengalami masalah pembuatan versi. Mungkin Anda memiliki Castle RC3 yang terdaftar di GAC dan menggunakan yang itu ...

Mauricio Scheffer
sumber
Menarik, saya mendapatkan build terbaru di sini: builds.castleproject.org/cruise/DownloadBuild.castle?number=956 Itulah yang mereka rekomendasikan di forum mereka. Juga jika itu masalahnya, saya membayangkan bahwa proyek tidak akan dapat dikompilasi sama sekali. Tapi ini tidak mengkompilasi masalah
George Mauer
Adapun memiliki versi di GAC, saya mungkin melakukannya, tetapi saya tidak menambahkan referensi dari GAC dan menggunakan reflektor pada referensi menunjukkan bahwa itu adalah yang saya pikir
George Mauer
Coba hapus perakitan duplikat dari GAC, saya bersedia menjadi masalah Anda.
Eric Schoonover
3

Saya mendapatkan ini sesekali dan selalu turun untuk memiliki perakitan di GAC

SteveC
sumber
3

Jika kesalahan ini disebabkan oleh perubahan namespace, pastikan folder proyek itu diganti namanya menjadi nama yang sama, dan tutup VS.NET Edit proyek yang bermasalah dengan Notepad dan ganti node yang ada

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

Iadine GOUNDETE
sumber
3

Menghapus file .pdb saya untuk dll memecahkan masalah ini untuk saya. Saya menduga itu ada hubungannya dengan fakta bahwa dll itu dibuat menggunakan ILMerge.

Shelby115
sumber
Ini untukku! Saya tidak tahu apa itu ILMerge tetapi Epicor tidak suka memiliki file pdb di sebelah rakitan saya.
MDave
Tidak ada ILMerge, tetapi menghapus semua file PDB menyelesaikan masalah.
hogarth45
3

Ketika saya mengalami masalah seperti itu, saya menemukan alat FUSLOGVW sangat membantu. Ini memeriksa informasi pengikatan perakitan dan mencatatnya untuk Anda. Terkadang pustaka hilang, terkadang GAC memiliki versi berbeda yang sedang dimuat. Terkadang platform pustaka yang direferensikan menyebabkan masalah. Alat ini menjelaskan bagaimana binding dependensi diselesaikan dan ini benar-benar dapat membantu Anda untuk menyelidiki / men-debug masalah Anda.

Fusion Log Viewer / fuslogvw / Assembly Binding Log Viewer. Periksa lebih lanjut / unduh di sini: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx .

Jakub Szumiato
sumber
Apakah ada cara untuk membuat FUSLOGVW bekerja dengan Visual Studio Designer? Visual Studio Designer memberikan pengecualian ketika saya mencoba mengedit salah satu dialog saya ("Metode tidak ditemukan"), untuk metode yang saya tahu ada (aplikasi berjalan dengan baik). Sejauh yang saya lihat, tidak ada yang muncul di FUSLOGVW saat mengedit sesuatu di Visual Studio Designer.
Jimmy
3

Saya mengalami masalah ini setelah memfaktorkan nama kelas:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

Menghentikan IIS dan menghapus konten di Temporary ASP.NET Filesmemperbaikinya untuk saya.

Tergantung pada proyek Anda (32 / 64bit, versi .net, dll), yang benar Temporary ASP.NET Filesberbeda:

  • 64 Bit
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 bit
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • Pada mesin dev saya (Karena IIS Express-nya mungkin?)
    %temp%\Temporary ASP.NET Files
CJSewell
sumber
3

Mungkin tidak mungkin, tetapi bagi saya itu disebabkan oleh aplikasi saya mencoba memuat perpustakaan dengan nama assembly yang sama (xxx.exe memuat xxx.dll).

ReflexiveCode
sumber
2

Jalankan saja ini dengan penyebab lain:

menjalankan pengujian unit dalam mode rilis tetapi pustaka yang dimuat adalah versi mode debug yang belum diperbarui

jk.
sumber
2

Solusi lain: DLL lama menunjuk satu sama lain dan di-cache oleh Visual Studio dalam format

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

Keluar dari VS, hapus semua yang ada di folder ini dan Bob paman Anda.

penyeringai
sumber
2

Saya memiliki masalah yang sama. Saya baru saja menyelesaikan ini dengan memperbarui perakitan melalui GAC.

Untuk menggunakan gacutil pada mesin pengembangan pergi ke: Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010).

Saya menggunakan perintah ini untuk menghapus dan menginstal ulang masing-masing.

gacutil /u myDLL

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

Catatan: Saya belum menghapus dll saya dalam kasus saya, saya baru saja memperbarui dll dengan jalur saat ini.

gaurav
sumber
2

Saya mengalami skenario ini ketika mencoba memuat jenis (melalui refleksi) dalam rakitan yang dibangun terhadap versi berbeda dari referensi umum untuk aplikasi tempat kesalahan ini muncul.

Karena saya yakin jenisnya tidak berubah di kedua versi rakitan, saya akhirnya membuat resolver rakitan khusus yang memetakan rakitan yang hilang ke yang sudah dimuat aplikasi saya. Cara termudah adalah dengan menambahkan konstruktor statis ke kelas program seperti ini:

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

Ini tentu saja mengasumsikan bahwa Assembly terletak di jalur startup aplikasi dan dapat dengan mudah disesuaikan.

JBartlau
sumber
Saya harus mencatat bahwa solusi ini berlaku untuk kasus di mana Anda memberikan rakitan Anda kepada pihak ketiga dan tidak dapat memastikan semua orang memperbarui tepat pada saat Anda melakukannya. Jika tidak, kompilasi ulang dengan referensi yang dikoreksi lebih disukai.
JBartlau
2

Jalankan saja ini dengan penyebab lain:

Saya menggunakan perakitan gabungan yang dibuat dengan ILRepack. Majelis yang Anda tanyakan jenisnya harus yang pertama diteruskan ke ILRepack atau jenisnya tidak akan tersedia.

Jenny O'Reilly
sumber
1

Hal ini biasanya terjadi ketika Anda memiliki satu versi rakitan yang diterapkan di GAC tetapi belum diperbarui dengan kelas baru yang mungkin telah Anda tambahkan pada rakitan di IDE Anda. Oleh karena itu, pastikan bahwa perakitan di GAC diperbarui dengan perubahan yang mungkin Anda buat dalam proyek Anda.

Misalnya, jika Anda memiliki Perpustakaan Kelas Umum dan di Perpustakaan Kelas Anda memiliki tipe Common.ClassA dan menerapkan ini ke GAC dengan nama yang kuat. Anda datang kemudian dan menambahkan tipe lain yang disebut Common.ClassB dan Anda menjalankan kode Anda pada IDE Anda tanpa terlebih dahulu menerapkan perubahan yang Anda buat ke GAC of Common dengan tipe Common.ClassB yang baru ditambahkan.

Dumisa
sumber
1

Saya mendapat kesalahan yang sama setelah memperbarui dll yang direferensikan dalam proyek desktop yang dapat dieksekusi. Masalahnya adalah karena orang-orang yang disebutkan di sini terkait dengan referensi lama dan mudah diperbaiki tetapi belum disebutkan di sini, jadi saya pikir ini mungkin menghemat waktu orang lain.

Pokoknya saya memperbarui dll A dan mendapat kesalahan dari dll referensi lain sebut saja B di sini di mana dll A memiliki referensi ke dll B.

Memperbarui dll B memperbaiki masalah.

Hamid Heydarian
sumber
1

Menambahkan DLL Anda ke GAC (cache perakitan global)

Visual Studio Command Prompt => Jalankan sebagai Administrator

gacutil / i "jalur file dll"

Anda dapat melihat perakitan tambahan C: \ Windows \ system32 \

Ini juga akan menyelesaikan dll yang hilang atau "Tidak dapat memuat file atau perakitan" dalam tugas Skrip SSIS

Ezhil Arasan
sumber
1
Saya akan mencatat bahwa menambahkan sesuatu ke GAC biasanya merupakan ide yang buruk, membuat penerapan lebih sulit, dan umumnya sesuatu yang bahkan Microsoft mundur darinya.
George Mauer
1

Saya mengalami masalah serupa di Visual Studio 2017 menggunakan MSTest sebagai kerangka pengujian. Saya menerima pengecualian System.TypeLoadException saat menjalankan beberapa (tidak semua) pengujian unit, tetapi pengujian unit tersebut akan lulus saat di-debug. Saya akhirnya melakukan hal berikut yang memecahkan masalah:

  1. Buka file Local.testsettings di solusinya
  2. Pergi ke pengaturan "Unit Test"
  3. Hapus centang "Gunakan Konteks Muat untuk majelis di direktori pengujian." kotak centang

Setelah mengambil langkah-langkah ini, semua pengujian unit mulai lulus saat dijalankan.

Chris
sumber
1

Saya mengalami hal yang sama seperti di atas setelah menghapus penandatanganan majelis dalam solusi. Proyek tidak akan dibangun.

Saya menemukan bahwa salah satu proyek mereferensikan paket StrongNamer NuGet, yang memodifikasi proses pembuatan dan mencoba untuk menandatangani paket Nuget yang tidak ditandatangani.

Setelah menghapus paket StrongNamer, saya dapat membangun proyek lagi tanpa menandatangani / memberi nama kuat rakitan.

Larsbj
sumber
0

Jika ini adalah aplikasi Windows, coba periksa duplikat di Global Assembly Cache (GAC). Ada sesuatu yang menimpa versi bin / debug Anda.

Jika ini adalah aplikasi web, Anda mungkin perlu menghapus di server dan mengunggah ulang. Jika Anda menerbitkan Anda mungkin ingin mencentang kotak Hapus semua file yang ada sebelum menerbitkan. Bergantung pada versi Visual Studio, itu harus ditempatkan di Publikasikan> Pengaturan> Opsi Penerbitan File Hapus semua file yang ada sebelum diterbitkan

Jeff
sumber
-2

Saya baru saja menyelesaikan ini dengan menjalankan perintah iisreset menggunakan command prompt ... Selalu hal pertama yang saya lakukan ketika saya mendapatkan kesalahan seperti itu.

Bas Wiebing
sumber
4
Maaf, tetapi ini tidak ada hubungannya dengan pertanyaan, membuat asumsi tentang penggunaan iis, dan tidak menjelaskan apa yang menyebabkan masalah tersebut.
George Mauer