2015-07-15 40 views
11

Burada çok fazla MEF sorusu inceledim ancak sorunumun ne olduğunu hayal edemiyorum. İşte neler oluyor:MEF Parçalar dağıtılmış uygulama için bulunamadı, ancak Hata Ayıklama modunda bulunamadı Hata

AdvancedInstaller ile konuşlandırdığım bir masaüstü WPF uygulamasına sahibim. Parçaları oluşturmak için .NET 4.0 ve MEF kullanıyorum. Bazı bölümler ana projede yer alır, bu yüzden app.exe dosyasının içinde bulunurlar. Diğer bölümler, ana projeye başvuran sınıf kitaplıkları içerisindedir, bu nedenle somename.dll dosyalarının içinde bulunurlar.

Sorun: Uygulamayı VS'den çalıştırırken, hem Hata Ayıklama hem de Sürüm'de her şey yolunda. Uygulamayı dağıttığım zaman, bazı dll'ler ihracat yapacak hiçbir parçanın (sıfır) olmadığını söylüyor.

  • tüm DLL dağıtım mevcuttur ve katalog
  • ihracat türleri ve isimleri, sonuçta her şey Visual Studio iken doğru çalıştığını dosyaları buluyor:

    aşağıdaki kontrol
  • Parçaları dlls'den eklemeyi denediğimde, parça sayısının YALNIZCA İSTİHDAMDA sıfır olduğunu anlıyorum.

Bu konuşlandırılmış app parçaları findind değil kodudur:

var catalog = new AggregateCatalog(); 
string path = Environment.CurrentDirectory.ToString(); 
DirectoryCatalog qualitycontrol = new DirectoryCatalog(".", "QualityControl.exe"); //this is my main assembly 
DirectoryCatalog qualitymix; 

catalog.Catalogs.Add(qualitycontrol); //this finds the parts and always works fine 

if (File.Exists(path + @"\QualityMix.dll")) 
{ 
    qualitymix = new DirectoryCatalog(".", "QualityMix.dll"); //the file exists in the deployment 
    catalog.Catalogs.Add(qualitymix); //the "qualitymix" catalog shows more than 20 parts if run with VS, but 0 parts in deployment 
} 

çalışan tek şey (ama Uygulamayı başlatmak için çok yavaş) şudur:

var catalog = new DirectoryCatalog(".", "*"); 

Bu, çalışma dizininde bulunan 100'den fazla dosyayı denetlemesi gereken bir sorundur ve eklenti disklerimi farklı bir dizine yerleştiremiyorum.

Neden tüm dosyalara bakan bir DirectoryCatalog bu bölümleri bulur, ancak DirectoryCatalog tek bir kısma bakarak değil mi? Yalnızca dağıtılan uygulamada olursa bu sorunu nasıl ayıklayabilirim?

--- Düzenle: Bu sorun yalnızca belirli disklerde gerçekleşiyor, dosyalar bulunur ve diğer diskler için parçalar da bulunur. Ben tüm dlls aynı İhracat/İthalat yordamını kullanıyorum, ancak bunların bir kısmı dağıtımda hiçbir parça gösterme

Önerebileceğiniz her şey yardımcı olacaktır, teşekkürler!


YENİ BİLGİ!

Derlememi bir AssemblyCatalog ile yüklemeyi denedim. Bu Visual Studio (hata ayıklama ve Yayın) çalışır ancak konuşlandırılmış zaman aşağıdaki hataları alıyorum:

1 deneyin:

if (File.Exists(path + @"\QualityMix.dll")) 
    {       
     qualitymix = new AssemblyCatalog(Assembly.LoadFile(path + @"\QualityMix.dll")); //file is loaded and parts found in VS 

     catalog.Catalogs.Add(qualitymix); 
    } 

Hata: modül derleme bildirimi içermesi bekleniyordu. (HRESULT özel durum: 0x80131018).

İkinci deneyin:

if (File.Exists(path + @"\QualityMix.dll")) 
    { 
     var name = AssemblyName.GetAssemblyName(path + @"\QualityMix.dll"); 
     qualitymix = new AssemblyCatalog(Assembly.Load(name)); 

     catalog.Catalogs.Add(qualitymix); 
    } 

Hata: Dosya veya derleme 'QualityMix.dll' ya da bağımlılıklarından biri yüklenemedi. Yanlış bir biçimde bir program yüklemek için girişimde bulunuldu.

Bu hatalarla ilgili sorular aradım ancak şu ana kadar hiçbir şey yardımcı olmuyor. Tüm projeler Tüm CPU'lar için üretilmiştir ve referanslar tamamdır (bu dll, tamam yüklenen diğer projelerle aynı referansları kullanır).


Düzenleme 2:

yerine Yük

if (File.Exists(path + @"\QualityMix.dll")) 
    { 
     qualitymix = new AssemblyCatalog(Assembly.LoadFrom(path + @"\QualityMix.dll")); 

     catalog.Catalogs.Add(qualitymix); 
    } 

LoadFrom kullanmak @SuryaBhaskar öneriyi çalıştı Ama aynı hatayı alıyorum: 'QualityMix dosya veya derleme yüklenemedi. dll 'veya bağımlılıklarından biri. Yanlış bir biçimde bir program yüklemek için girişimde bulunuldu. Kullanım LoadFrom yerine LoadFile veya load.If ait

+0

Environment.Current dağıtılmış uygulamada beklediğinizi mi? Her iki durumda da ne döndüğünü kontrol edin. – VMaleev

+0

Öneriniz için @VMaleev'e teşekkürler. CurrentDirectory iyi, dll dosyasını buluyor tamam. – Hannish

+0

Bu çözümü boşuna çalıştım: http://stackoverflow.com/questions/9119224/mef-parts-list-sometimes-empty?rq=1 – Hannish

cevap

0

Ben yeni projeye sorunlu dll kodunu taşıyarak bu sorunu çözmek için yönetilen geçerli AppDomain diğer ünitelerine olan çatışmaları olacak yükleyin kullanın. Bu, bir şekilde sorunu çözdü ... ... bunun sebebi benim için bir maskaralık olsa da.

-1

Eğer

+0

Cevabınız için teşekkür ederiz. Lütfen oylama için önerilen çözümünüzün bir kod örneğini sağlayın. – Hannish

+0

container.ComposeParts(); var assemblies = aggregateCatalog.Parts.Select (bölüm => ReflectionModelServices.GetPartType (bölüm) .Value.Assembly) .Distinct() .List(); foreach (Assembly dll derlemeler) { // Koşullara bağlı olarak montajınızı doğru montaj değişkenine yükleyin assmbly = Assembly.LoadFrom (dll.Location); \t} – SuryaBhaskar

+0

Teşekkür ederizSuryaBhaskar, ama cevabınızı düzenlemelisiniz, böylece herkes için kolayca görülebilir. Daha fazla oy alırsanız cevabınız o kadar iyi olur. Yaklaşımını deneyeceğim ve bilmeni istiyorum. – Hannish

İlgili konular