我正在使用C#开发VS2008,这是一款适用于霍尼韦尔Dolphin 6100的应用程序,这是一款带条码扫描器的移动计算机,使用Windows CE 5.0,如操作系统。
我想添加一个可以将文件从本地设备发送到远程服务器的功能。我发现librairy“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();
有人对此有任何想法吗?我会非常感激!!!
答案 0 :(得分:35)
它可以是任何数量的东西。可能的原因是:
您最好的选择是使用Fusion日志查看器来帮助诊断它。文档在这里:
http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx
(仅供参考“Fusion”是设计程序集加载系统的团队的代号;有些不幸的是代码名称最终出现在已发布产品的文件名中。该东西应该被称为“AssemblyBindingLogViewer”。 exe“或某些此类事物。”
答案 1 :(得分:20)
Eric Lippert的答案完美地描述了这种情况。
我只想添加一个关于案例的快速回答,该案例通常不会被有关此例外的帮助页面所涵盖。
我创造了一个快速&一些开源软件(Akka.Net,名称)的脏测试项目,我将项目命名为“Akka”。
它完美构建,但在启动时会抛出关于Akka.dll中类的类型加载异常。
这只是因为我的可执行文件(akka.exe)和引用(akka.dll)具有相同的名称。我花了几分钟来计算这个(我开始使用复制本地,目标平台,确切版本等等)。
这是非常愚蠢但不强行的第一件事你会想到(特别是因为我使用nuget作为依赖),所以我认为分享它会很有趣:如果你的EXE和依赖有你的话,你会遇到TypeLoadException同名。
答案 2 :(得分:3)
这可能是由任何数量的事情造成的,MSDN称之为:
当公共语言运行库找不到程序集,程序集中的类型或无法加载类型时,抛出TypeLoadException。
所以很明显找不到类型,缺少程序集,缺少类型或者运行时配置之间存在冲突。
有时会出现问题,因为您引用的程序集是与您正在使用的程序集不同的平台类型(32位/ 64位等)。
我建议捕获异常并更详细地检查它以确定它有什么问题。
继我之前的信息
有时我看到这个问题出现是因为(出于某种原因)引用的程序集实际上无法解析,即使它已被引用和加载。
我通常会在涉及AppDomain边界时看到这一点。
我发现有时解决问题的一种方法(但只有当程序集已经在AppDomain中时)才是这段代码片段:
AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
return AppDomain.CurrentDomain.GetAssemblies()
.SingleOrDefault(asm => asm.FullName == e.Name);
}
就像我说的那样,当AppDomains参与其中时我会看到这个问题,当程序集确实已经被引用和加载时,这似乎解决了它。我不知道为什么框架无法解析引用本身。
答案 3 :(得分:3)
这几乎让我疯狂......
我不知道我是如何管理它的,但由于某种原因,我在GAC中有一个旧版本的DLL。尝试在那里寻找旧组件并将其移除。
祝你好运!
答案 4 :(得分:1)
您可以通过在注册表中启用某些设置来从.NET Compact Framework中获取加载程序日志文件。 Power Toys for .NET Compact Framework包含一个名为NETCFLogging的工具,它为您设置注册表值。
此处记录了注册表值:
http://msdn.microsoft.com/en-us/library/ms229650(v=VS.90).aspx
答案 5 :(得分:0)
在我的情况下,问题是我有两个项目在一个解决方案中使用相同的库。我只在第一个项目中更新了DLL。 因此,当我构建解决方案时,第二个项目是从第一个项目(项目构建顺序)中覆盖DLL。
示例:
解决方案:
- MainProject
------ MyDll v5.3.2.0
- 原型
------ MyDll v5.0.0.0
在第二个项目中更新DLL后出现问题。
答案 6 :(得分:0)
确保名称(名称空间,类名称等)与它们的名称相同。我必须重新开始项目时遇到此错误,我从模板复制了班级的内容,但无法将类名从“ Template Class”更改为正确的名称(应该与项目名匹配)
答案 7 :(得分:0)
typeName字符串参数必须是标准类型名称
例如: Activator.CreateInstance(“ assemblyFullName”,“ namespace.typename”)