什么可能导致System.TypeLoadException?

J.M*_*M.J 24 c# ssh smart-device windows-ce visual-studio

我正在使用C#开发VS2008,这是一款适用于霍尼韦尔Dolphin 6100的应用程序,这是一款带有条码扫描器的移动计算机,它使用Windows CE 5.0,如操作系统.

我想添加一个功能,可以将文件从本地设备发送到远程服务器.我找到了可以保证这一点的图书馆" Tamir.SharpSSH ".我在控制台应用程序和普通的Windows窗体应用程序上测试了代码,它运行得很好.但是当我尝试在winCE设备上使用相同的代码时,我得到一个TypeLoadException并且我有错误消息:

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

我使用的代码如下所示:

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();
Run Code Online (Sandbox Code Playgroud)

有谁对此有任何想法?我会非常感激!!!

Eri*_*ert 38

它可以是任何数量的东西.可能的原因是:

  • 无法找到装配
  • 无法找到装配所依赖的装配体
  • 找到了程序集,但类型不在其中
  • 类型的静态构造函数抛出异常

您最好的选择是使用Fusion日志查看器来帮助诊断它.文档在这里:

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

(仅供参考"Fusion"是设计程序集加载系统的团队的代号;有些不幸的是代码名称最终出现在已发布产品的文件名中.该东西应该被称为"AssemblyBindingLogViewer.exe"或者一些这样的事情.)

  • 对我来说,这是静态构造函数抛出异常。谢谢。 (2认同)

AFr*_*act 23

Eric Lippert的答案完美地描述了这种情况.

我只想添加一个关于案例的快速答案,该案例通常不包含在有关此例外的帮助页面中.

我为一些开源软件创建了一个快速而肮脏的测试项目(Akka.Net,将其命名),我将项目命名为"Akka".

它完美构建,但在启动时会抛出类型加载异常关于Akka.dll中的类.

这只是因为我的可执行文件(akka.exe)和引用(akka.dll)具有相同的名称.我花了几分钟来计算这个(我开始使用复制本地,目标平台,确切版本等等).

这是非常愚蠢的但不强制你会想到的第一件事(特别是因为我使用nuget作为依赖项),所以我认为分享它会很有趣:如果你的EXE和依赖名称相同,你会遇到TypeLoadException.

  • 这是我的问题 - 主.exe项目引用同一解决方案中的另一个项目,但程序集名称是相同的.谢谢! (2认同)

Hud*_*son 5

这几乎把我逼疯了......

我不知道我是如何管理这个的,但出于某种原因,我在 GAC 中有一个旧版本的 DLL。尝试在那里寻找旧组件并将其删除。

祝你好运!