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

pero me daproblema elenco de la clase a la interfaz

No se puede convertir objeto de tipo 'Logic.SlovenianSearchQueryManager' al tipo 'Logic.ISearchQueryManager'.

EDIT: StackTrace toda

System.InvalidCastException era no controlada por el código de usuario
mensaje = "No se puede convertir objeto de tipo 'Logic.SlovenianSearchQueryManager' a tipo 'Logic.ISearchQueryManager'"
Fuente = "ViaMura.Web.Module"
StackTrace: en ViaMura.Web.Module.WebController.GetAdvertismentsByRawQuery (String rawQuery, página Int32, Int32 pageSize, cadena orderBy, Int32 & recuento) en D: \ PROJEKTI \ crawler \ WebCrawlerSuite \ ViaMura.Web.Module \ WebController.cs: línea en ViaMura.Web.Module.Views.SearchResultsPresenter.OnResultsLoad (Int32 página, Int32 pageSize, cadena orderBy) en D: \ PROJEKTI \ crawler \ WebCrawlerSuite \ ViaMura.Web.Module \ Views \ SearchResultsPresenter.cs: línea en ViaMura.Web.Searc hResults.SearchAdvertisments() en D: \ PROJEKTI \ rastreador \ WebCrawlerSuite \ ViaMura.Web \ SearchResults.aspx.cs: línea en ViaMura.Web.SearchResults.Page_Load (Object remitente, EventArgs e) en D : \ PROJEKTI \ crawler \ WebCrawlerSuite \ ViaMura.Web \ SearchResults.aspx.cs: línea 149 en System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, objeto O, objeto t, EventArgs e) al sistema. Web.Util.CalliEventHandlerDelegateProxy.Callback (Object remitente, EventArgs e) en System.Web.UI.Control.OnLoad (EventArgs e) en ViaMura.Web.App_Code.PageControllers.BasePage.O nLoad (EventArgs e) en D: \ PROJEKTI \ crawler \ WebCrawlerSuite \ ViaMura.Web \ App_Code \ PageControllers \ BasePage.cs: Línea 89 en System.Web.UI.Control.LoadRecursive() en System.Web. UI.Page.ProcessRequestMain (booleano includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:

Edit2:

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

me dan el mismo resultado:

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

pero

string a3 = queryManagerType.Assembly.Location; 

me da camino diferente:

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

+3

Por favor enviar el seguimiento de pila de excepción completo. Sospecho que tienes esta interfaz 'ISearchQueryManager' definida en dos ensamblajes diferentes. –

+0

@Darin o dos espacios de nombres –

Respuesta

8

En mi experiencia, los problemas de tipo no coincidentes como este siempre son causados ​​por los tipos de carga desde dos ubicaciones diferentes, incluso si crees que deberían ser cargados desde el mismo lugar.

Compare: Two Types not equal that should be

intente buscar en la propiedad Assembly.Location de cada tipo en el depurador:

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

thx uso un ensamblaje incorrecto. No utilizo Assembly.Load en lugar de Assembly.LoadFrom – senzacionale

2

Una posible razón para que esto ocurra es que tiene esta interfaz ISearchQueryManager definida en dos assem diferentes blies que de hecho no representa el mismo tipo. Veo que estás jugando con una carga dinámica de ensamblaje. Por lo tanto, la interfaz a la que está transfiriendo estáticamente no es la interfaz implementada por la clase SlovenianSearchQueryManager, incluso si tiene el mismo nombre.

+0

hola, ninguna interfaz ISearchQueryManager está solo en un ensamblaje. – senzacionale

+0

¿Es este un sitio web ASP.NET o una aplicación ASP.NET? ¿Tiene algún código en la carpeta 'App_Code'? Inspeccione su carpeta 'bin' en busca de ensamblajes deshonestos que podría haber cambiado de nombre y olvidado que aún contienen la interfaz anterior. –

+0

limpio el proyecto y lo reconstruyo. este es el sitio web aspx. Tengo app_code pero no hay interfice allí. – senzacionale

0

¿Puede intentar imprimir las interfaces desde el objeto creado antes de convertirlo (Type.GetInterfaces()).? eso podría darle una idea de qué interfaces están expuestas y obtendrá lo que cree que está obteniendo ... o utilizando la variación Activate.CreateInstance (String, String) y también pasará el nombre del ensamblado.

+0

sí, en lugar de ensamblar, llamo a la interfaz por referencia al proyecto. ¿Puedo llamarlo desde el ensamblaje también? – senzacionale

0

Es posible que tenga que hacer esto:

registrarse para este evento en algún lugar de su código de inicio de la aplicación (Program.cs es un buen lugar):

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

Y luego manejarlo así:

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

Mi entendimiento es que esto asegurará que un ensamblaje cargado dinámicamente resolverá sus dependencias utilizando ensamblados ya cargados en lugar de cargar una nueva copia de un alre ady cargado ensamblaje. Esto evita el tipo de problemas que ha observado donde el mismo Tipo no es válido porque se ha cargado en el contexto de una copia diferente del conjunto.

0

¿Es la interfaz definida dos veces, en dos asambleas? Esto me sucedió cuando arrastré y solté una interfaz entre proyectos pensando que VS la movería, pero la interfaz realmente se copió.

descubrí esto mirando la propiedad Assembly.Location de cada tipo (gracias Jorgen!)

Cuestiones relacionadas