2012-03-08 18 views
10

Sono abbastanza nuovo in C# e sto riscontrando un problema durante il caricamento di una libreria nel mio programma. Im cercando di eseguire this esempio in Visual Studio, ma sto ottenendo un errore:TypeLoadException non gestito in C#

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

Questo è ciò che il mio codice è simile:

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

}

Ho aggiunto la DLL come un riferimento tramite solution explorer. Cosa potrebbe andare storto?


Ho avviato un nuovo progetto, aggiunto la dll come riferimento, ho eseguito il progetto e ora tutto funziona. Molto frustrante non sapere cosa è andato storto, ma sospetto che abbia qualcosa a che fare con il nome del progetto e il nome della dll sia lo stesso. Grazie dell'aiuto!

+0

È necessario dai dettagli quali sono gli assembly in Program e Problema in. Quale linea causa l'eccezione. In quale piattaforma sono compilati tutti gli assembly, la versione dei riferimenti è specifica? Hai provato a eliminare il cestino e le directory obj e ricostruire? –

+0

Cosa intendi con il montaggio? Non vi è alcuna riga menzionata che causa l'errore, purtroppo, l'EXE e le DLL – Freek8

+0

si chiamano assiemi. –

risposta

23

MODIFICA: Ok, grazie alla risposta, ora sono riuscito a riprodurre il problema senza SVM. Fondamentalmente, non dovresti avere due assembly con lo stesso nome, uno in un file .exe e uno in un file .dll. Ecco un esempio:

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

Compile:

> 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) 

È già stato caricato un assembly chiamato Test da Test.exe ... quindi non sta andando a cercare Test.dll.

+0

grazie, dove posso cambiare questa variabile? Sarebbe d'aiuto se ho copiato manualmente la DLL nella cartella del progetto? – Freek8

+1

@ Freek8: se si guarda la finestra "Proprietà" quando è evidenziato il riferimento, dovrebbe essere mostrato lì. Come hai provato a eseguire il programma? Come hai aggiunto il riferimento? –

+0

Ho fatto clic con il pulsante destro del mouse su riferimenti> Aggiungi e selezionato la DLL. CopyLocal era già vero. Ho eseguito il programma tramite Debug> Avvia il debug delle idee – Freek8

2

Volevo aggiungere questo come commento (ma non ancora abbastanza alto rappresentante) - Ho avuto questo problema esatto e ho trovato la risposta @JonSkeet davvero utile, tra me e un collega ci siamo imbattuti nella risposta;

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

Fondamentalmente il mio assembly di progetto che ha generato un file EXE è stato denominato come un assembly di riferimento che ho creato come libreria di classi. La combinazione dell'EXE e della DLL nella directory di compilazione fa sì che l'errore venga generato poiché è possibile caricare solo un assembly di quel nome.

Problemi correlati