it-swarm.com.de

Was könnte eine System.TypeLoadException verursachen?

Ich entwickle mit VS2008 mit C # eine Anwendung für Honeywell Dolphin 6100, einen mobilen Computer mit einem Barcode-Scanner, der Windows CE 5.0 wie ein Betriebssystem verwendet.

Ich möchte eine Funktion hinzufügen, mit der Dateien vom lokalen Gerät an den entfernten Server gesendet werden können. Ich habe die Librairy " Tamir.SharpSSH " gefunden, die dies garantieren kann. Ich habe den Code in einer Konsolenanwendung und in einer normalen Windows Forms-Anwendung getestet und funktioniert einwandfrei. Wenn ich jedoch versucht habe, denselben Code auf dem winCE-Gerät zu verwenden, erhalte ich eine TypeLoadException und die Fehlermeldung:

 Der Typ 'Tamir.SharpSsh.SshTransferProtocolBase' konnte nicht aus der Assembly geladen werden.

der Code, den ich verwende, ist wie folgt:

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

Hat jemand eine Idee dazu? Ich bin wirklich dankbar !!!

18
J.M.J

Es könnte eine beliebige Anzahl von Dingen sein. Mögliche Ursachen sind:

  • Die Versammlung kann nicht gefunden werden
  • Eine Versammlung, von der Ihre Versammlung abhängt, kann nicht gefunden werden
  • Die Assembly wurde gefunden, aber der Typ ist nicht darin enthalten
  • Der statische Konstruktor des Typs löst eine Ausnahme aus

Am besten verwenden Sie den Fusion-Protokoll-Viewer, um die Diagnose zu erleichtern. Die Dokumentation ist hier:

http://msdn.Microsoft.com/de-de/library/e74a18c4(v=vs.110).aspx

(FYI "Fusion" war der Codename des Teams, das das Assembly-Ladesystem entworfen hat; es ist etwas unglücklich, dass der Codename im Dateinamen des ausgelieferten Produkts endete. Das Ding hätte "AssemblyBindingLogViewer.exe" oder heißen sollen so etwas.)

32
Eric Lippert

Die Antwort von Eric Lippert beschreibt die Situation perfekt. 

Ich möchte nur eine kurze Antwort zu einem Fall hinzufügen, der normalerweise nicht von Hilfeseiten zu dieser Ausnahme abgedeckt wird.

Ich habe ein Quick & Dirty-Testprojekt für Open Source-Sachen (Akka.Net) erstellt, und ich nenne das Projekt selbst "Akka". 

Es wird perfekt erstellt, aber beim Start wird eine Ausnahmebedingung für eine Klasse in Akka.dll ausgegeben.

Dies liegt nur daran, dass meine ausführbare Datei (akka.exe) und die Referenz (akka.dll) denselben Namen haben. Ich habe ein paar Minuten gebraucht, um das herauszufinden. 

Es ist etwas sehr Dummes, aber nicht gewaltsam das erste, was Sie denken werden (besonders, da ich Nuget für Abhängigkeiten verwendet habe). Ich dachte, es könnte interessant sein, es weiterzugeben: TypeLoadException wird auftreten, wenn Ihre EXE und eine Abhängigkeit denselben Namen haben.

19
AFract

Das hat mich fast verrückt gemacht ...

Ich weiß nicht, wie ich das geschafft habe, aber aus irgendeinem Grund hatte ich eine alte Version von DLL in GAC. Suchen Sie dort nach einer alten Baugruppe und entfernen Sie sie.

Viel Glück!

3
Hudson

Dies kann durch eine Reihe von Dingen verursacht werden, laut MSDN:

TypeLoadException wird ausgelöst, wenn die Common Language Runtime die Assembly, den Typ in der Assembly nicht findet oder den Typ nicht laden kann.

Es ist also klar, dass ein Typ nicht gefunden werden kann. Entweder fehlt die Assembly, der Typ fehlt oder es gibt einen Konflikt zwischen den Laufzeitkonfigurationen.

Manchmal kann das Problem auftreten, weil es sich bei der Assembly, auf die Sie referenzieren, um einen anderen Plattformtyp (32-Bit/64-Bit usw.) handelt als den, von dem Sie konsumieren.

Ich würde empfehlen, die Ausnahme abzufangen und sie genauer zu untersuchen, um herauszufinden, womit sie Probleme hat.


Weiter zu meinen vorherigen Informationen

Manchmal habe ich gesehen, dass dieses Problem auftauchte, weil (aus einem oder anderen Grund) eine referenzierte Assembly nicht wirklich gelöst werden kann, obwohl sie referenziert und geladen wurde.

Ich sehe das normalerweise, wenn AppDomain-Grenzen involviert sind.

Ich habe herausgefunden, dass das Problem manchmal behoben wird (aber nur, wenn sich die Assembly bereits in der AppDomain befindet): Dieser kleine Code-Snippet ist:

AppDomain.CurrentDomain.AsemblyResolve += (s, e) =>
{
   return AppDomain.CurrentDomain.GetAssemblies()
      .SingleOrDefault(asm => asm.FullName == e.Name);
}

Wie gesagt, ich sehe dieses Problem, wenn AppDomains involviert ist, und dies scheint es zu lösen, wenn die Assembly tatsächlich bereits referenziert und geladen ist. Ich habe keine Ahnung, warum das Framework die Referenz selbst nicht auflöst.

3
Clint

Sie können Loader-Protokolldateien aus .NET Compact Framework abrufen, indem Sie einige Einstellungen in der Registrierung aktivieren. Das Power Toys für .NET Compact Framework enthält ein Tool namens NETCFLogging, das die Registrierungswerte für Sie festlegt.

Die Registrierungswerte sind hier dokumentiert:

http://msdn.Microsoft.com/de-de/library/ms229650(v=VS.90).aspx

1
Mike Dimmick

Stellen Sie sicher, dass die Namen (Namespaces, Klassennamen usw.) die sind, die sie sein sollen. Ich habe diese Fehlermeldung erhalten, als ich mit meinem Projekt neu beginnen musste. Ich habe den Inhalt meiner Klasse aus einer Vorlage kopiert und konnte den Klassennamen nicht von "Template Class" in den richtigen Namen ändern (er sollte mit dem Projektnamen übereinstimmen). .

0
makesha.laun

In meinem Fall bestand das Problem darin, dass ich zwei Projekte hatte, die die gleichen Bibliotheken in einer Lösung verwendeten. Ich habe DLLs nur im ersten Projekt aktualisiert. Wenn ich also eine Lösung erstellt habe, überschreiben DLLs ihre ersten DLLs aus dem ersten Projekt (Projekterstellungsauftrag). 

Beispiel:

Lösung: 

--Hauptprojekt

------ MyDll v5.3.2.0

--Prototyp

------ MyDll v5.0.0.0

Problem nach Update-DLLs im zweiten Projekt verschwunden.

0
Mroczny Arturek