2012-03-08 13 views
10

Soy bastante nuevo en C# y tengo un problema al cargar una biblioteca en mi programa. Im tratando de correr this ejemplo, en el estudio visual, pero estoy recibiendo un error:TypeLoadException no se ha manejado en C#

TypeLoadException was unhandled. Can't load type SVM.Problem from assembly SVM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. 

Esto es lo que se ve mi código como:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SVM; 

namespace SVM 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     //First, read in the training data. 
     Problem train = Problem.Read("a1a.train"); 
     Problem test = Problem.Read("a1a.test"); 

     //For this example (and indeed, many scenarios), the default 
     //parameters will suffice. 
     Parameter parameters = new Parameter(); 
     double C; 
     double Gamma; 

     //This will do a grid optimization to find the best parameters 
     //and store them in C and Gamma, outputting the entire 
     //search to params.txt. 
     ParameterSelection.Grid(train, parameters, "params.txt", out C, out Gamma); 
     parameters.C = C; 
     parameters.Gamma = Gamma; 

     //Train the model using the optimal parameters. 
     Model model = Training.Train(train, parameters); 

     //Perform classification on the test data, putting the 
     //results in results.txt. 
     Prediction.Predict(test, "results.txt", model, false); 
    } 
} 

}

he añadido la DLL como una referencia a través del explorador de soluciones. ¿Qué podría estar yendo mal?


Comencé un nuevo proyecto, agregué el dll como referencia, ejecuté el proyecto y ahora todo funciona. Es muy frustrante no saber qué fue lo que salió mal, pero sospecho que tuvo algo que ver con que el nombre del proyecto y el nombre dll sean los mismos. ¡Gracias por ayudar!

+0

Necesita detalles, qué conjuntos son Programa y Problema en. Qué línea causa la excepción. ¿En qué plataforma están compilados cada ensamblaje, la versión de referencia es específica? ¿Intentó eliminar los directorios bin y obj y reconstruir? –

+0

¿Qué quiere decir con ensamblaje? No se menciona ninguna línea que ocasione el error desafortunadamente – Freek8

+0

EXE y DLL se llaman ensamblados. –

Respuesta

23

EDITAR: Bien, debido a su respuesta, he logrado reproducir el problema sin SVM. Básicamente, no debería tener dos ensamblados con el mismo nombre, uno en .exe y otro en .dll. He aquí un ejemplo:

Library.cs:

public class Library 
{ 
    public static void Foo() 
    { 
     System.Console.WriteLine("Library.Foo"); 
    } 
} 

Test.cs:

public class Test 
{ 
    static void Main(string[] args) 
    { 
     Library.Foo(); 
    } 
} 

Compilar:

> csc /target:library /out:Test.dll Library.cs 
> csc /r:Test.dll Test.cs 

Run:

> test.exe 

Unhandled Exception: System.TypeLoadException: Could not load type 'Library' from 
assembly 'Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.+ 
    at Test.Main(String[] args) 

Ya se ha cargado un ensamblado llamado Test de Test.exe ... por lo que no va a también busque Test.dll.

+0

gracias, ¿dónde puedo cambiar esta variable? ¿Ayudaría si copiara manualmente el dll en la carpeta del proyecto? – Freek8

+1

@ Freek8: si mira la ventana "Propiedades" cuando tiene la referencia resaltada, se debe mostrar allí. ¿Cómo trataste de ejecutar el programa? ¿Cómo agregaste la referencia? –

+0

Hice clic derecho en referencias> Agregar y seleccioné el dll. CopyLocal ya era cierto. Ejecuté el programa a través de Debug> Start Debugging – Freek8

2

Quería agregar esto como un comentario (pero aún no lo suficientemente alto): tuve este problema exacto y encontré la respuesta de @JonSkeet realmente útil, entre mí y un colega tropezamos con la respuesta;

https://stackoverflow.com/a/13236893/692942.

Básicamente, mi ensamblado de proyecto que generó un archivo EXE se denominó igual que un ensamblaje al que hice referencia como biblioteca de clases. La combinación de EXE y DLL en el directorio de compilación provoca el error ya que solo se puede cargar un ensamblado de ese nombre.

Cuestiones relacionadas