Montaj hatasından tür yüklenemedi


120

Castle Windsor'un Akıcı Arayüzünü öğrenmeye çalışırken aşağıdaki basit testi yazdım:

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

Testi TestDriven.NET aracılığıyla yürüttüğümde aşağıdaki hatayı alıyorum:

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

Testi NUnit GUI aracılığıyla yürüttüğümde şunu elde ediyorum:

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.

Reflector'da referans verdiğim Meclisi açarsam, bilgilerinin şöyle olduğunu görebilirim:

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

ve kesinlikle Castle.MicroKernel.Registration.IRegistration içerdiğini

Ne oluyor olabilir?

Nant ile hiç çalışmadığım halde , ikililerin Castle'ın en son sürümünden alındığını belirtmeliyim, bu yüzden kaynaktan yeniden derleme zahmetine girmedim ve sadece bin dizinindeki dosyaları aldım. Ayrıca projemin sorunsuz derlendiğini de belirtmeliyim.

Yanıtlar:


111

Derleme Genel Derleme Önbelleğinde (GAC) veya yüklenmekte olduğunu düşündüğünüz derlemeyi geçersiz kılan herhangi bir yerde mi? Bu genellikle yanlış bir derlemenin yüklenmesinin sonucudur, benim için bu genellikle GAC'de bin / Debug'da sahip olduğum sürümü geçersiz kılan bir şey olduğu anlamına gelir.


1
Dll dosyalarına göz atarak derlemeleri ekledim, dolayısıyla GAC ​​denkleme girmemeli. Ayrıca montaj-> çözüm kaşifinden gelen reflektörü aç üzerine sağ tıklayın, reflektörde beklediğim tüm bilgileri getirir
George Mauer

7
Nasıl eklediğiniz önemli değil, GAC'de aynı ada / sürüme sahip bir derleme varsa, onu yükleyecektir.
Eric Schoonover

1
VS.NET, seçtiğiniz derleme yolunu listeler ve yansıtıcı doğru derlemeyi açar, ancak uygulama çalıştırıldığında .NET çalışma zamanı GAC'deki derlemeyi yükler.
Eric Schoonover

11
Bu, bu cevap kıçımı ikinci kez kurtardı. Yapabilseydim tekrar oy kullanırdım.
whybird

17
(GAK. Yüksek sesle söyleyin. Adın sesi sizi nasıl olduğu konusunda uyarır.)
Whybird

131

Başka bir projeye başvuran bir projeniz varsa (bir 'Sınıf Kitaplığı'na başvuran' Windows Uygulaması 'türü gibi) ve her ikisi de aynı Assembly adına sahipse, bu hatayı alırsınız. Referans verilen projeyi güçlü bir şekilde adlandırabilir veya (daha da iyisi) referans projesinin montajını yeniden adlandırabilirsiniz (VS'deki proje özelliklerinin 'Uygulama' sekmesi altında).


Ek olarak: çıktı klasörünü temizlemeyi deneyin. Muhtemelen, kitaplığın yeniden adlandırılması aynı soruna neden olabilir, çünkü ikisi de (eski ve yeni) aynı çıktı klasörüne yerleştirilecektir.
Manushin Igor

Bir projeyi kesip yapıştırırsanız ve tüm alanları doğru şekilde düzenlemezseniz, bu soruna yol açabilir!
Michael Parker

1
Bu benim için öyleydi, zaten başvurulan sınıf kitaplığında Assembly'ye başvurmuştum. Çalışması için paketi nuGet'te kaldırdıktan sonra web projemin web.config dosyasına gitmem ve <dependantAssembly> referansını kaldırmam gerekti.
Ivan

16

Bunun benim için çözümünden yukarıda bahsedilmedi, bu yüzden cevabımı uzun kuyruğa ekleyeceğimi düşündüm ...

HttpHandlerWeb.config dosyasında artık kullanılmayan (ve artık geçerli bir referans olmayan) bir sınıfa (an ) eski bir referans aldım . Bazı nedenlerden dolayı Studio'da çalışırken yok sayıldı (veya belki de bu sınıfa geliştirici kurulumumda hala erişilebilir durumda olabilir miyim?) Ve bu nedenle bu hatayı yalnızca IIS'ye dağıtmayı denediğimde aldım. Web.config'deki derleme adını aradım, kullanılmayan işleyici referansını kaldırdım, sonra bu hata ortadan kalktı ve her şey harika çalışıyor. Umarım bu başka birine yardımcı olur.


1
Çok benzer bir şey vardı, tek fark, DLL'ye yönelik web.config başvurusunun hala bin dizininde konuşlandırılmış olmasıydı. Bu ikili dosya, istisnaya neden olan paylaşılan bir DLL'nin eski bir sürümüne başvuruyordu.
santos

10

Aynı sorunu yaşadım ve benim için bunun ad alanı veya proje adlandırma ile hiçbir ilgisi yoktu.

Ancak birkaç kullanıcının ima ettiği gibi, hala referans gösterilen eski bir montajla ilgisi vardı.

Tüm projelerin tüm "bin" / ikili klasörlerini silmenizi ve tüm çözümü yeniden oluşturmanızı öneririm. Bu, potansiyel olarak eski montajları temizledi ve bundan sonra MEF, tüm eklentilerimi sorunsuz bir şekilde dışa aktardı.


8

Bu hatayı alıyordum ve StackOverflow'da veya başka bir yerde bulduğum hiçbir şey sorunu çözmedi , ancak bmoeskau'nun bu soruya cevabı , henüz bir cevap olarak bahsedilmeyen düzeltme için doğru yönü gösterdi. Cevabım kesinlikle orijinal soruyla ilgili değil, ancak bu sorunu yaşayan birinin Google'da veya benzer bir şeyde arama yaparak burada bir yol bulacağı varsayımıyla buraya gönderiyorum (bundan bir ay sonra bu beni tekrar ısırdığında benim gibi) , arg!).

Montajım GAC içinde, bu nedenle teorik olarak mevcut montajın yalnızca bir sürümü var. IIS dışında eski sürümü yardımcı bir şekilde önbelleğe alıyor ve bana bu hatayı veriyor. Montajı GAC'de yeni değiştirdim, yeniden inşa ettim ve yeniden kurdum. Olası bir çözüm, w3wp.exe'yi öldürmek için Görev Yöneticisi'ni kullanmaktır . Bu, IIS'yi derlemeyi GAC'den yeniden okumaya zorlar: sorun çözüldü.


3

Sürüm = 1.0.3.0, Castle RC3'ü gösterir, ancak akıcı arayüz RC3'ün piyasaya sürülmesinden birkaç ay sonra geliştirildi. Bu nedenle, bir sürüm oluşturma sorununuz var gibi görünüyor. Belki GAC’de kayıtlı Castle RC3 var ve o bunu kullanıyor ...


İlginç, en son derlemeyi burada buldum: builds.castleproject.org/cruise/DownloadBuild.castle?number=956 Forumlarında önerdikleri şey. Ayrıca eğer durum buysa, projenin hiç derlenmeyeceğini düşünürdüm. Ancak bu derleme sorun değil
George Mauer

Sürüme GAC'de sahip olmaya gelince, muhtemelen yapıyorum, ancak GAC'deki referansı eklemedim ve referansta reflektör kullanmak bunun düşündüğüm olduğunu gösteriyor
George Mauer

Yinelenen derlemeyi GAC'den kaldırmayı deneyin, sorunun bu olmaya hazırım.
Eric Schoonover

3

Bunu ara sıra alıyorum ve montajın GAC'de olması her zaman düşüyor


3

Bu hata ad alanının değiştirilmesinden kaynaklanıyorsa, o projenin klasörünün aynı adla yeniden adlandırıldığından emin olun ve VS.NET'i kapatın Not Defteri ile sorunu olan projeyi düzenleyin ve buradaki düğümleri değiştirin

"Kök Ad Alanı> Yeni_Adı_Of_Folder_Of_Your_Project_Namespace" KökAd Alanı> "AssemblyName> Yeni_Adı_Of_Folder_Of_Your_Project_Namespace" AssemblyName>


3

Dll için .pdb dosyamı silmek bu sorunu çözdü benim için. Dll'nin ILMerge kullanılarak oluşturulmuş olmasıyla bir ilgisi olduğunu tahmin ediyorum.


Bu benim içindi! ILMerge'in ne olduğunu bilmiyorum ama Epicor, derlememin yanında pdb dosyasının olmasını istemedi.
MDave

ILMerge yok, ancak tüm PDB dosyalarını silmek sorunu çözdü.
hogarth45

3

Böyle bir sorunla karşılaştığımda, FUSLOGVW aracını çok faydalı buluyorum. Montaj bağlama bilgilerini kontrol eder ve sizin için kaydeder. Bazen kitaplıklar eksiktir, bazen GAC'nin yüklenmekte olan farklı sürümleri vardır. Bazen başvurulan kitaplıkların platformu sorunlara neden oluyor. Bu araç, bağımlılıkların bağlarının nasıl çözüldüğünü açıklığa kavuşturur ve bu, sorununuzu araştırmanıza / hata ayıklamanıza gerçekten yardımcı olabilir.

Fusion Günlük Görüntüleyici / fuslogvw / Assembly Binding Log Viewer. Daha fazlasını kontrol edin / buradan indirin: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx .


FUSLOGVW'nin Visual Studio Designer ile çalışmasını sağlamanın bir yolu var mı? Visual Studio Designer, iletişim kutularımdan birini düzenlemeye çalıştığımda ("Yöntem bulunamadı"), var olduğunu bildiğim bir yöntem için bir istisna atıyor (uygulama iyi çalışıyor). Gördüğüm kadarıyla, Visual Studio Designer'da bir şey düzenlerken FUSLOGVW'de hiçbir şey görünmüyor.
Jimmy

3

Bir sınıf adını çarpanlara ayırdıktan sonra bu sorunu yaşadım:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

IIS'yi durdurmak ve içindeki içeriği silmek Temporary ASP.NET Filesbenim için düzeltildi.

Projenize bağlı olarak (32 / 64bit, .net sürümü, vb.) Doğru olanı Temporary ASP.NET Filesfarklıdır:

  • 64 Bit
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 Bit
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • Geliştirme makinemde öyleydi (IIS Express olabilir mi?)
    %temp%\Temporary ASP.NET Files

3

Belki o kadar olası değil, ama benim için bu, uygulamamın aynı derleme adına sahip bir kitaplık yüklemeye çalışmasından kaynaklanıyordu (xxx.exe yükleme xxx.dll).


2

Bununla başka bir nedenle karşılaşın:

yayın modunda birim testleri çalıştırıyor ancak yüklenen kitaplık, güncellenmemiş hata ayıklama modu sürümüydü


2

Yine başka bir çözüm: Birbirine işaret eden ve Visual Studio tarafından önbelleğe alınan eski DLL'ler

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

VS'den çık, bu klasördeki her şeyi sil ve Bob amcan olur.


2

Ben de aynı sorunu yaşadım. Montajı GAC aracılığıyla güncelleyerek bunu çözdüm.

Bir gelişme makinede GacUtil kullanmak için gidin: Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010).

Bu komutları sırasıyla kaldırmak ve yeniden yüklemek için kullandım.

gacutil /u myDLL

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

Not: Benim durumumda dll'yi kaldırmadım, mevcut yolla dll'yi güncelledim.


2

Bu hatanın ortaya çıktığı uygulama için ortak olan bir referansın farklı bir sürümüne karşı oluşturulan bir derlemede bir tür (yansıma yoluyla) yüklemeye çalışırken bu senaryoya rastladım.

Tipin montajın her iki sürümünde de değişmediğinden emin olduğumdan, eksik montajı uygulamamın zaten yüklediği montajla eşleyen özel bir montaj çözümleyicisi oluşturdum. En basit yol, program sınıfına aşağıdaki gibi statik bir kurucu eklemektir:

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

Bu elbette, Meclisin uygulamanın başlangıç ​​yolunda bulunduğunu ve kolayca uyarlanabileceğini varsayar.


Bu çözümün, meclislerinizi üçüncü şahıslara verdiğiniz ve herkesin tam zamanında güncelleme yapmasını sağlayamayacağı durumlar için geçerli olduğunu unutmamalıyım. Aksi takdirde, düzeltilmiş referanslarla yeniden derleme tercih edilir.
JBartlau

2

Bununla başka bir nedenle karşılaşın:

ILRepack ile oluşturulmuş birleştirilmiş bir derleme kullanıyordum. Türleri sorguladığınız derleme, ILRepack'e geçirilen ilk derleme olmalıdır, aksi takdirde türleri kullanılamayacaktır.



1

Bu genellikle derlemenizin bir sürümü GAC'de konuşlandırıldığında ancak IDE'nizdeki derlemeye eklemiş olabileceğiniz yeni sınıflarla güncellenmediğinde gerçekleşir. Bu nedenle, GAC'deki derlemenin projenizde yapmış olabileceğiniz değişikliklerle güncellendiğinden emin olun.

Örneğin, bir Ortak Sınıf Kitaplığınız varsa ve bu Sınıf Kitaplığında Common.ClassA türüne sahipseniz ve bunu kesin olarak adlandırılmış GAC'ye dağıtabilirsiniz. Daha sonra gelir ve Common.ClassB adında başka bir tür eklersiniz ve yeni eklenen Common.ClassB türü ile Common.ClassB türünde yaptığınız değişiklikleri ilk önce dağıtmadan IDE'nizde kodunuzu çalıştırırsınız.


1

Masaüstü çalıştırılabilir bir projede başvurulan bir dll'yi güncelledikten sonra aynı hatayı aldım. Sorun, burada bahsedilen insanların eski bir referansla ilgili olması ve düzeltilmesi basit olmasıydı, ancak burada bahsedilmemiştir, bu yüzden başkalarının zamanından tasarruf edebileceğini düşündüm.

Her neyse, dll A'yı güncelledim ve başka bir başvurulan dll'den hatayı aldım, buraya B diyelim, burada dll A'nın dll B'ye referansı var.

Dll B'nin güncellenmesi sorunu çözdü.


1

DLL dosyanızı GAC'ye ekleme (genel derleme önbelleği)

Visual Studio Komut İstemi => Yönetici Olarak Çalıştır

gacutil / i "dll dosyası yolu"

Eklenmiş derlemeyi görebilirsiniz C: \ Windows \ system32 \

Ayrıca SSIS Komut Dosyası görevindeki eksik dll'yi veya "Dosya veya derleme yüklenemedi" sorununu çözecektir.


1
GAC'ye bir şeyler eklemenin genellikle kötü bir fikir olduğunu, dağıtımı zorlaştırdığını ve genellikle Microsoft'un bile geri çektiği bir şey olduğunu not edeceğim.
George Mauer

1

Test çerçevesi olarak MSTest'i kullanarak Visual Studio 2017'de benzer bir sorun yaşadım. Bazı (tümü değil) birim testleri çalıştırırken System.TypeLoadException özel durumları alıyordum, ancak bu birim testleri hata ayıklandığında geçecekti. Sonunda sorunu çözen aşağıdakileri yaptım:

  1. Çözümde Local.testsettings dosyasını açın
  2. "Birim Testi" ayarlarına gidin
  3. "Test dizinindeki derlemeler için Yükleme Bağlamını kullan" seçeneğinin işaretini kaldırın. Onay kutusu

Bu adımları uyguladıktan sonra tüm birim testleri çalıştırıldığında geçmeye başladı.


1

Çözümdeki montaj işaretlerini kaldırdıktan sonra yukarıdakiyle aynı şeyi deneyimledim. Projeler inşa etmeyecek.

Projelerden birinin, derleme sürecini değiştiren ve imzalanmamış Nuget paketlerini imzalamaya çalışan StrongNamer NuGet paketine başvurduğunu buldum.

StrongNamer paketini kaldırdıktan sonra, derlemeleri imzalamadan / güçlü adlandırmadan projeyi yeniden oluşturabildim.


0

Bu bir Windows uygulamasıysa, Global Assembly Cache (GAC) içinde bir kopya olup olmadığını kontrol etmeyi deneyin. Bir şey bin / hata ayıklama sürümünüzü geçersiz kılıyor.

Bu bir web uygulamasıysa, sunucuyu silmeniz ve yeniden yüklemeniz gerekebilir. Yayınlıyorsanız, yayınlamadan önce mevcut tüm dosyaları sil onay kutusunu işaretlemek isteyebilirsiniz. Visual Studio sürümüne bağlı olarak, Yayınla> Ayarlar> Dosya Yayınlama Seçenekleri'nde bulunmalıdır. Yayınlamadan önce mevcut tüm dosyaları silin


-2

Bunu komut istemini kullanarak iisreset komutunu çalıştırarak çözdüm ... Her zaman böyle hatalar aldığımda yaptığım ilk şey.


4
Üzgünüm ama bunun soruyla hiçbir ilgisi yok, iis kullanımıyla ilgili varsayımlar yapıyor ve soruna neyin neden olduğunu açıklamıyor.
George Mauer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.