2011-01-18 32 views
5
Assembly assembly = Assembly.LoadFrom("Logic\\bin\\Debug\\Logic.dll"); 
      Type queryManagerType = assembly.GetType("Logic." + HttpContext.Current.Session["lang_name"] + "SearchQueryManager"); 
      var queryManager = (ISearchQueryManager)Activator.CreateInstance(queryManagerType); 


public interface ISearchQueryManager 
    { 
     IList<Advertisements> ApplyQueries(string searchQuery, int page, int pageSize, string orderBy, out int count); 
    } 

public class SlovenianSearchQueryManager : ISearchQueryManager 
    { 
... 
} 

arayüz ama 'Logic.ISearchQueryManager' yazın döküm sorun

türü 'Logic.SlovenianSearchQueryManager' nesne döküm edilemiyor

alır.

DÜZENLEME: Bütün StackTrace

System.Web.HttpUnhandledException kullanıcı kodu tarafından işlenmeyen olduğu


Mesaj = " türü 'Logic.ISearchQueryManager' için tip amacı 'Logic.SlovenianSearchQueryManager' döküm edilemiyor"
Kaynak = "ViaMura.Web.Module"
StackTrace: ViaMura.Web.Module.WebController.GetAdvertismentsByRawQuery de (dize rawQuery, Int32 sayfa, ınt32 pageSize, Dize orderBy, Int32 & sayımı) D: \ PROJEKTI \ paletli \ WebCrawlerSuite \ ViaMura.Web.Module \ WebController.cs: hattı ViaMura.Web.Module.Views.SearchResultsPresenter.OnResultsLoad de (Int32 sayfa ınt32 pageSize, dize orderBy) D: \ PROJEKTI \ paletli \ WebCrawlerSuite \ ViaMura.Web.Module \ Views \ SearchResultsPresenter.cs: satır , ViaMura.Web.Searc hResults.SearchAdvertisments() D: \ PROJEKTI \ paletli \ WebCrawlerSuite \ ViaMura.Web SearchResults.aspx.cs \: D ViaMura.Web.SearchResults.Page_Load (Obje gönderen, EventArgs e) hat : \ PROJEKTI \ paletli \ WebCrawlerSuite \ ViaMura.Web SearchResults.aspx.cs \: System.Web.Util.CalliHelper.EventArgFunctionCaller satır (IntPtr fp, nesne o nesne t, EventArgs e) System'de . Web.Util.CalliEventHandlerDelegateProxy.Callback (Object sender, EventArgs e) System.Web.UI.Control.OnLoad de (EventArgs e) ViaMura.Web.App_Code.PageControllers.BasePage.O de nLoad D (EventArgs e): \ PROJEKTI \ paletli \ WebCrawlerSuite \ ViaMura.Web \ App_Code \ PageControllers BasePage.cs \: satır 89 System.Web.UI.Control.LoadRecursive de() System.Web de . UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boole includeStagesAfterAsyncPoint)
InnerException:

EDIT2:

string a1 = typeof (ISearchQueryManager).Assembly.Location; 
string a2 = typeof(SlovenianSearchQueryManager).Assembly.Location 

bana aynı sonucu verir:

C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 53975f83 \ 5438a399 \ Temporary ASP.NET Files \ root \ montaj \ \ dl3 \ 0f9540b5 \ 15407fe2_5db7cb01 \ Mantık.DLL

ama

string a3 = queryManagerType.Assembly.Location; 

bana farklı bir yol sunar:

D: \ PROJEKTI \ paletli \ WebCrawlerSuite \ WebCrawler.Logic bin \ \ Debug \ WebCrawler.Logic.dll

+3

tam durum yığını izlemesi gönderin. İki farklı derlemede tanımlanmış olan bu "ISearchQueryManager" arayüzüne sahip olduğunuzdan şüpheleniyorum. –

+0

@Darin veya iki ad alanı –

cevap

8

Tecrübemde, bu tür uyumsuzluk sorunları yazın, bunlar her zaman aynı yerden yüklenebileceğini düşünürseniz bile, iki farklı konumdan yükleme türlerine bağlıdır.

karşılaştırın: Two Types not equal that should be

ayıklayıcısında her tür Assembly.Location özelliğine bakarak deneyin:

typeof(ISearchQueryManager).Assembly.Location 
typeof(SlovenianSearchQueryManager).Assembly.Location 
+1

thx yanlış montaj kullanıyorum. Hayır Assembly.LoadFrom yerine Assembly.Load kullanıyorum – senzacionale

2

Bunun gerçekleşmesinin olası bir nedeni, iki farklı eşlemde tanımlanmış olan bu ISearchQueryManager arabirimine sahip olmanızdır. aslında aynı türü temsil etmeyen blies. Dinamik montaj yüklemesi ile oynuyorsunuz. Bu nedenle, statik olarak dönüştürdüğünüz arabirim, aynı ada sahip olsa bile SlovenianSearchQueryManager sınıfı tarafından uygulanan arabirim değildir.

+0

Merhaba, hiçbir ISearchQueryManager arabirimi yalnızca bir derlemede değil. – senzacionale

+0

Bu bir ASP.NET web sitesi mi yoksa ASP.NET uygulaması mı? App_Code klasöründe kodunuz var mı? Yeniden adlandırılmış ve hala eski arabirimi içerdiğini unutmuş olabileceğiniz haydut meclisleri için 'bin' klasörünüzü denetleyin. –

+0

Projeyi temizler ve yeniden oluşturur. Bu aspx web sitesidir. App_code'ım var ama orada interfice yok. – senzacionale

0

Arabirimleri, dökümden önce oluşturulan nesneden yazdırmayı deneyebilir misiniz (Type.GetInterfaces()).? Bu, hangi arabirimlerin açığa çıktığı hakkında bir fikir verebilir ve ne yaptığınızı düşünüyorsunuz .. veya Activator.CreateInstance (String, String) varyasyonunu kullanarak ve Assembly adını da iletin.

+0

evet, derleme yerine proje başvurusu ile arayüz arayın. Meclisten de diyebilir miyim? – senzacionale

0

Bunu gerekebilir: Böyle

//Since we'll be dynamically loading assemblies at runtime, we need to add an appropriate resolution path 
    //Otherwise weird things like failing to instantiate TypeConverters will happen 
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

Sonra hallederim: uygulamanız başlatma kodu bir yere bu olay için

Kayıt (program.cs iyi bir yerdir)

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var domain = (AppDomain) sender; 

     foreach (var assembly in domain.GetAssemblies()) 
     { 
      if (assembly.FullName == args.Name) 
       return assembly; 
     } 

     return null; 
    } 

Anlayışım, dinamik olarak yüklenmiş bir derlemenin, yeni bir belgenin yeni bir kopyasını yüklemek yerine, zaten yüklenmiş olan derlemeleri kullanarak bağımlılıklarını çözmesini sağlayacaktır. ady yüklü derleme. Bu, aynı türün geçerli olmadığı durumlarda karşılaştığınız sorunların türünü engeller çünkü montajın farklı bir kopyası bağlamında yüklenir.

0

iki defa tanımlanan arayüz mi, iki meclislerinde? Bu, VS'nin onu taşıyacağını düşünen projeler arasında bir arabirimi sürükleyip bıraktığımda oldu, ancak arabirim aslında kopyalandı.

Ben her tür Assembly.Location özelliği (teşekkürler Jorgen!) Bakarak keşfetti