What could be causing a System.TypeLoadException?

2019-01-09 12:06发布

I'm developing, with VS2008 using C#, an application for Honeywell Dolphin 6100, a mobile computer with a barcode scanner that uses Windows CE 5.0 like OS.

I want to add a functionality that can send files from the local device to the distant server. I found the librairy "Tamir.SharpSSH " which can garantee this. I tested the code on a console application and on normal windows forms application and it works perfectly. But when I tried to use the same code on the winCE device, I get a TypeLoadException and I have the error message :

Could not load type 'Tamir.SharpSsh.SshTransferProtocolBase' from assembly 'Tamir.SharpSSH,   
Version=1.1.1.13, Culture=neutral, PublicKeyToken=null'.

the code that I'm use is like below :

SshTransferProtocolBase sshCp = new Scp(Tools.GlobalVarMeth.hostName, Tools.GlobalVarMeth.serverUserName);
sshCp.Password = Tools.GlobalVarMeth.serverUserpassword;
sshCp.Connect();

string localFile = Tools.GlobalVarMeth.applicationPath + "/" + fileName + ".csv";
string remoteFile = Tools.GlobalVarMeth.serverRemoteFilePath + "/" + fileName + ".csv";

sshCp.Put(localFile, remoteFile);

sshCp.Close();

Any one have any idea on this ? I will be really gratefull !!!

7条回答
2楼-- · 2019-01-09 12:18

It could be any number of things. Likely causes are:

  • The assembly cannot be found
  • An assembly that your assembly depends upon cannot be found
  • The assembly is found but the type isn't in it
  • The type's static constructor throws an exception

Your best bet is to use the Fusion log viewer to help diagnose it. Documentation is here:

http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

(FYI "Fusion" was the code name of the team that designed the assembly loading system; it is somewhat unfortunate that the code name ended up in the file name of the shipped product. The thing should have been called "AssemblyBindingLogViewer.exe" or some such thing.)

查看更多
欢心
3楼-- · 2019-01-09 12:22

Make sure the names (namespaces, class names, etc) are what they are supposed to be. I got this error when I had to start over on my project and I copied the contents of my class from a template and failed to change the class name from "Template Class" to the correct name (it was supposed to match the project name).

查看更多
祖国的老花朵
4楼-- · 2019-01-09 12:23

This almost drove me crazy...

I don't know how I managed this, but for some reason I had an old version of the DLL in GAC. Try looking for an old assembly there and remove it.

Best of luck!

查看更多
太酷不给撩
5楼-- · 2019-01-09 12:37

The answer of Eric Lippert perfectly describes the situation.

I just want to add a quick answer about a case which is usually not covered by help pages regarding this exception.

I've created a quick & dirty test project for some open source stuff (Akka.Net, to name it) and I name the project itself "Akka".

It perfectly builds, but at startup it throws it type load exception regarding a class in Akka.dll.

This is just because my executable (akka.exe) and the reference (akka.dll) have the same name. It took me a few minutes to figure this (I've began by things such as copy local, target platform, exact version... etc).

It's something very dumb but not forcibly the first thing which you will think (especially since I used nuget for dependancies), so I thought it could be interesting to share it : you will encounter TypeLoadException if your EXE and a dependancy have the same name.

查看更多
Root(大扎)
6楼-- · 2019-01-09 12:37

In my case problem was that I had two projects that used the same libraries in one solution. I've updated DLLs only in first project. So when I built solution, second project its override DLLs from first project(project build order).

Example:

Solution:

--MainProject

------MyDll v5.3.2.0

--Prototype

------MyDll v5.0.0.0

Problem gone after update DLLs in second project.

查看更多
做自己的国王
7楼-- · 2019-01-09 12:38

You can get loader log files out of the .NET Compact Framework by enabling some settings in the registry. The Power Toys for .NET Compact Framework include a tool called NETCFLogging, which sets the registry values for you.

The registry values are documented here:

http://msdn.microsoft.com/en-us/library/ms229650(v=VS.90).aspx

查看更多
登录 后发表回答