TypeLoadException was unhandled in C#

2019-02-12 13:15发布

I'm fairly new to C#, and am having a problem when loading a library into my program. Im trying to run this example in visual studio, but I am getting an error:

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

This is what my code looks like:

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

}

I have added the dll as a reference via the solution explorer. What could be going wrong?


I have started a new project, added the dll as a reference, ran the project and now everything works. Very frustrating not to know what went wrong, but I suspect it had something to do with the project name and the dll name being the same. Thanks for helping!

标签: c# dll
2条回答
男人必须洒脱
2楼-- · 2019-02-12 13:34

EDIT: Okay, due to your answer, I've now managed to reproduce the problem without SVM. Basically, you shouldn't have two assemblies with the same name, one in a .exe and one in a .dll. Here's an example:

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)

It's already loaded an assembly called Test from Test.exe... so it's not going to also look for Test.dll.

查看更多
欢心
3楼-- · 2019-02-12 13:43

I wanted to add this as a comment (but not high enough rep yet) - I had this exact issue and found @JonSkeet answer really useful, between myself and a colleague we stumbled on the answer;

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

Basically my project assembly which generated an EXE file was named the same as a referenced assembly I built as a class library. The combination of the EXE and DLL in the build directory cause the error to be thrown as only one assembly of that name could be loaded.

查看更多
登录 后发表回答