2012-03-08 5 views
10

私はC#をかなり新しくしており、プログラムにライブラリをロードする際に問題があります。イムは、Visual Studioでthis例を実行しようとしているが、私はエラーを取得しています: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を参照として追加してプロジェクトを実行しましたが、今はすべて動作します。何が間違っていたのか分かりませんが、非常にイライラしていますが、プロジェクト名とdll名が同じであることが関係していると思われます。助けてくれてありがとう!

+0

詳細は、どのアセンブリがプログラムと問題であるかの詳細が必要です。例外を引き起こす行はどれですか。それぞれのアセンブリはどのプラットフォームでコンパイルされていますか? binとobjのディレクトリを削除して再構築しようとしましたか? –

+0

アセンブリではどういう意味ですか?残念ながらエラーの原因となる行はありません – Freek8

+0

EXEとDLLはアセンブリと呼ばれます。 –

答えて

23

編集:はい、あなたの答えのために、私は今SVMなしで問題を再現することができました。基本的には、同じ名前を持つ2つのアセンブリを持つことはできません.1つは.exeに、もう1つは.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(); 
    } 
} 

がコンパイル:

> 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.exeからTestというアセンブリがロードされているので、にもなりません。 Test.dllを探します。

+0

ありがとう、どこでこの変数を変更できますか? DLLをプロジェクトフォルダに手動でコピーした場合、どうなるでしょうか? – Freek8

+1

@ Freek8:参照が強調表示されているときに[プロパティ]ウィンドウを見ると、そこに表示されるはずです。どのようにプログラムを実行しようとしましたか?どのようにリファレンスを追加しましたか? –

+0

リファレンスを右クリックして> dllを追加して選択しました。 CopyLocalはすでにtrueでした。デバッグ>デバッグを開始してプログラムを実行しました – Freek8

2

私はこれをコメントとして追加したいと思っていますが(まだ十分な担当者ではありません) - 私はこの正確な問題を抱え、@ JonSkeetが本当に役立つ答えを見つけました。

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

基本的に私のプロジェクトアセンブリは、EXEファイルを生成しましたが、私はクラスライブラリとしてビルドされた参照アセンブリと同じ名前です。ビルドディレクトリ内のEXEとDLLの組み合わせにより、その名前のアセンブリが1つしかロードされないため、エラーがスローされます。

関連する問題