从类到接口转换问题

sen*_*ale 6 c#

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
    {
...
}
Run Code Online (Sandbox Code Playgroud)

但我明白了

无法将"Logic.SlovenianSearchQueryManager"类型的对象强制转换为"Logic.ISearchQueryManager".

编辑:整个堆栈跟踪

用户代码未处理System.InvalidCastException
消息="无法将类型为'Logic.SlovenianSearchQueryManager'的对象强制转换为'Logic.ISearchQueryManager'."
Source ="ViaMura.Web.Module"
StackTrace:位于D:\ PROJEKTI\crawler\WebCrawlerSuite\ViaMura.Web中的ViaMura.Web.Module.WebController.GetAdvertismentsByRawQuery(String rawQuery,Int32 page,Int32 pageSize,String orderBy,Int32&count) .Module\WebController.cs:D:\ PROJEKTI\crawler\WebCrawlerSuite\ViaMura.Web.Module\Views\SearchResultsPresenter中的ViaMura.Web.Module.Views.SearchResultsPresenter.OnResultsLoad(Int32页面,Int32 pageSize,String orderBy)第32行.cs:第43行在ViaMura.Web.SearchResults.SearchAdvertisments()中的D:\ PROJEKTI\crawler\WebCrawlerSuite\ViaMura.Web\SearchResults.aspx.cs:第155行,位于ViaMura.Web.SearchResults.Page_Load(Object sender,EventArgs) e)在系统中的System:Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object o,Object t,EventArgs e)的D:\ PROJEKTI\crawler\WebCrawlerSuite\ViaMura.Web\SearchResults.aspx.cs:第149行.位于ViaMura.Web.App_C的System.Web.UI.Control.OnLoad(EventArgs e)上的Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,EventArgs e)系统中System.Web.UI.Control.LoadRecursive()的D:\ PROJEKTI\crawler\WebCrawlerSuite\ViaMura.Web\App_Code\PageControllers\BasePage.cs:第89行中的ode.PageControllers.BasePage.OnLoad(EventArgs e). Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)
InnerException:

EDIT2:

string a1 = typeof (ISearchQueryManager).Assembly.Location;
string a2 = typeof(SlovenianSearchQueryManager).Assembly.Location
Run Code Online (Sandbox Code Playgroud)

给我相同的结果:

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

string a3 = queryManagerType.Assembly.Location;
Run Code Online (Sandbox Code Playgroud)

给了我不同的路径:

d:\ PROJEKTI \履带\ WebCrawlerSuite\WebCrawler.Logic\BIN \调试\ WebCrawler.Logic.dll

Jor*_*lin 9

根据我的经验,像这样的类型不匹配问题总是由两个不同位置的加载类型引起,即使您认为它们应该从同一个地方加载.

比较:两种类型不应该相等

尝试查看调试器中每种类型的Assembly.Location属性:

typeof(ISearchQueryManager).Assembly.Location
typeof(SlovenianSearchQueryManager).Assembly.Location
Run Code Online (Sandbox Code Playgroud)

  • 我使用错误的装配.不,我使用Assembly.Load而不是Assembly.LoadFrom (2认同)