2011-01-18 26 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 
    { 
... 
} 

nhưng tôi nhận đượccast vấn đề từ lớp giao diện

Không thể cast đối tượng của loại 'Logic.SlovenianSearchQueryManager' gõ 'Logic.ISearchQueryManager'.

EDIT: toàn bộ stacktrace

System.InvalidCastException là unhandled bởi mã người dùng
nhắn = "Không thể để cast đối tượng kiểu 'Logic.SlovenianSearchQueryManager' để gõ 'Logic.ISearchQueryManager'"
Source = "ViaMura.Web.Module"
StackTrace: tại ViaMura.Web.Module.WebController.GetAdvertismentsByRawQuery (String rawQuery, trang Int32, Int32 PageSize, Chuỗi orderBy, Int32 & count) trong D: \ PROJEKTI \ bánh xích \ WebCrawlerSuite \ ViaMura.Web.Module \ WebController.cs: dòng tại ViaMura.Web.Module.Views.SearchResultsPresenter.OnResultsLoad (Int32 trang, Int32 PageSize, string orderBy) trong D: \ PROJEKTI \ crawler \ WebCrawlerSuite \ ViaMura.Web.Module \ Views \ SearchResultsPresenter.cs: dòng tại ViaMura.Web.Searc hResults.SearchAdvertisments() trong D: \ PROJEKTI \ bánh xích \ WebCrawlerSuite \ ViaMura.Web \ SearchResults.aspx.cs: dòng tại ViaMura.Web.SearchResults.Page_Load (Object sender, EventArgs e) trong D : \ PROJEKTI \ crawler \ WebCrawlerSuite \ ViaMura.Web \ SearchResults.aspx.cs: dòng tại System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Object o, Object t, EventArgs e) tại Hệ thống. Web.Util.CalliEventHandlerDelegateProxy.Callback (Đối tượng người gửi, EventArgs e) tại System.Web.UI.Control.OnLoad (EventArgs e) tại ViaMura.Web.App_Code.PageControllers.BasePage.O nLoad (EventArgs e) trong D: \ PROJEKTI \ crawler \ WebCrawlerSuite \ ViaMura.Web \ App_Code \ PageControllers \ BasePage.cs: dòng 89 tại System.Web.UI.Control.LoadRecursive() tại System.Web. UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:

EDIT2:

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

cho tôi kết quả tương tự:

C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ root \ 5438a399 \ 53975f83 \ lắp ráp \ DL3 \ 0f9540b5 \ 15407fe2_5db7cb01 \ Logic.DLL

nhưng

string a3 = queryManagerType.Assembly.Location; 

mang lại cho tôi con đường khác nhau:

D: \ PROJEKTI \ bánh xích \ WebCrawlerSuite \ WebCrawler.Logic \ bin \ Debug \ WebCrawler.Logic.dll

+3

Vui lòng đăng theo dõi ngăn xếp ngoại lệ đầy đủ. Tôi nghi ngờ rằng bạn có giao diện 'ISearchQueryManager' này được định nghĩa trong hai hội đồng khác nhau. –

+0

@Darin hoặc hai không gian tên –

Trả lời

8

Theo kinh nghiệm của tôi, hãy nhập các vấn đề không phù hợp như thế này luôn do tải loại từ hai vị trí khác nhau, ngay cả khi bạn cho rằng chúng sẽ được tải từ cùng một vị trí.

Hãy so sánh: Two Types not equal that should be

Hãy thử nhìn vào tài sản Assembly.Location của từng loại trong debugger:

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

thx i sử dụng lắp ráp sai. Không, tôi sử dụng Assembly.Load từ thay vì Assembly.LoadFrom – senzacionale

2

Một lý do có thể xảy ra cho sự cố này là bạn có giao diện ISearchQueryManager này được xác định trong hai lệnh khác nhau blies mà trên thực tế không đại diện cho cùng một loại. Tôi thấy rằng bạn đang chơi với tải lắp ráp động. Vì vậy, giao diện bạn đang tĩnh đúc đến không phải là giao diện được thực hiện bởi lớp SlovenianSearchQueryManager ngay cả khi nó có cùng tên.

+0

Xin chào, không có giao diện ISearchQueryManager nào chỉ trong một assembly. – senzacionale

+0

Đây có phải là trang web ASP.NET hoặc ứng dụng ASP.NET không? Bạn có một số mã trong thư mục 'App_Code' không? Kiểm tra thư mục 'bin' của bạn cho các hội đồng giả mạo mà bạn có thể đã đổi tên và quên đi về nó vẫn chứa giao diện cũ. –

+0

tôi làm sạch dự án và xây dựng lại nó. đây là trang web aspx. Tôi có app_code nhưng không có can thiệp ở đó. – senzacionale

0

Bạn có thể thử in ra các giao diện từ đối tượng được tạo trước khi truyền nó (Type.GetInterfaces()).? có thể cung cấp cho bạn ý tưởng về giao diện nào được hiển thị và bạn đang nhận được những gì bạn nghĩ mình đang nhận được. hoặc sử dụng biến thể Activator.CreateInstance (Chuỗi, Chuỗi) và chuyển tên Hội đồng.

+0

có tôi gọi giao diện bằng cách tham khảo dự án thay vì lắp ráp. Tôi có thể gọi nó từ lắp ráp không? – senzacionale

0

Bạn có thể cần phải làm điều này:

Đăng ký cho sự kiện này ở đâu đó trong mã khởi động ứng dụng của bạn (Program.cs là một nơi tốt):

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

Và sau đó xử lý nó như thế này:

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

Sự hiểu biết của tôi là điều này sẽ đảm bảo rằng cụm được nạp động sẽ giải quyết các phụ thuộc của nó bằng cách sử dụng các hội đồng đã được tải thay vì tải bản sao mới của một alre lắp ráp ady nạp. Điều này ngăn cản loại vấn đề bạn đã quan sát thấy cùng một Loại không hợp lệ vì nó được tải trong ngữ cảnh của một bản sao khác của assembly.

0

là giao diện được định nghĩa hai lần, trong hai hội? Điều này xảy ra với tôi khi tôi kéo-và-thả một giao diện giữa các dự án nghĩ VS sẽ di chuyển nó, nhưng giao diện đã thực sự được sao chép.

Tôi phát hiện ra điều này bằng cách xem xét thuộc tính Assembly.Location của từng loại (cảm ơn Jorgen!)

Các vấn đề liên quan