2012-03-08 2 views
10

Я довольно новичок в C#, и у меня возникла проблема при загрузке библиотеки в мою программу. Im пытается запустить this пример в Visual Studio, но я получаю сообщение об ошибке:TypeLoadException не был обработан в C#

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

Это то, что мой код выглядит следующим образом:

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

}

Я добавил длл, как ссылку через проводник решений. Что может пойти не так?


Я начал новый проект, добавил dll в качестве ссылки, запустил проект, и теперь все работает. Очень расстраивает, чтобы не знать, что пошло не так, но я подозреваю, что это связано с именем проекта и именем dll. Спасибо за помощь!

+0

Необходимость в деталях, в каких сборках есть программа и проблема. Какая строка вызывает исключение. На какой платформе собраны все собранные вами сборки, есть ли конкретная версия ссылок? Вы пытались удалить каталоги bin и obj и перестроить? –

+0

Что вы имеете в виду со сборкой? Нет упоминаемой линии, которая вызывает ошибку, к сожалению – Freek8

+0

EXE и DLL называются сборками. –

ответ

23

EDIT: Хорошо, из-за вашего ответа мне удалось воспроизвести проблему без SVM. В принципе, у вас не должно быть двух сборок с тем же именем: одно в .exe и одно в .dll. Вот пример:

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 

Пробег:

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

Он уже загрузил сборку под названием Test из Test.exe ... так что это не будет также ищите Test.dll.

+0

спасибо, где я могу изменить эту переменную? Помогло бы мне вручную скопировать dll в папку проекта? – Freek8

+1

@ Freek8: Если вы посмотрите на окно «Свойства», когда вы указали ссылку, она должна быть показана там. Как вы пытались запустить программу? Как вы добавили ссылку? –

+0

Я щелкнул правой кнопкой мыши по ссылкам> Добавить и выбрал dll. CopyLocal уже был прав. Я запускал программу через Debug> Start Debugging – Freek8

2

Я хотел бы добавить это как комментарий (но пока не достаточно высокий показатель). У меня была эта точная проблема, и я нашел ответ @JonSkeet действительно полезным, между мной и коллегой мы наткнулись на ответ;

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

В основном моя сборка проекта, которая сгенерировала EXE-файл, была названа той же самой, что и ссылочная сборка, которую я построил как библиотеку классов. Комбинация EXE и DLL в каталоге сборки вызывает появление ошибки, поскольку может быть загружена только одна сборка этого имени.

Смежные вопросы