In einem Smart-Device-Projekt Ich versuche, eine Funktion zu pinvoke, die angeblich in mscoree.dll verfügbar sein sollte. Die zugehörige Definition lautet wie folgt:Verschiedene mscoree.dll Einstiegspunkte auf dem Desktop & auf einem Gerät?
[DllImport("mscoree.dll", EntryPoint = "#29")]
internal static extern int Object_GetHashCode(object obj);
Sie diese in der internen Klasse EE mit Reflektor in mscorlib.dll finden. Beachten Sie, dass diese Funktion von Object.GetHashCode() aufgerufen wird.
Ich habe ein Smart-Gerät-Test-Projekt, die Object_GetHashCode indirekt aufruft. Wenn ich es auf dem Desktop laufe, funktioniert alles einwandfrei. Wenn ich es auf einem Emulator ausführen, erhalte ich die folgende Fehlermeldung:
System.MissingMethodException: Kann einen Einstiegspunkt '# 29' in einer PInvoke-DLL 'mscoree.dll' nicht finden.
Warum passiert das? Wird auf dem Emulator und auf dem Desktop nicht genau die gleiche mscorlib.dll ausgeführt? Es scheint so, denn wenn ich mir die Implementierung von Object.GetHashCode() ansehe, die mit mscorlib.dll kommt, die in der NETCFv35.ppc.armv4.cab verteilt ist, dann sehe ich, dass sie auch EE.Object_GetHashCode() aufruft. Warum kann mscorlib.dll in mscoree.dll aufrufen und ich kann nicht?
EDIT:
Die mscorlib Referenz in der Visual Studio-Projekt verweist auf die folgende Datei,
C: \ Program Files \ Microsoft.NET \ SDK \ Compactframework \ WindowsCE v3.5 \ \ mscorlib.dll (210kb)
aber standardmäßig Reflector zeigt den Inhalt der folgenden Datei:
C: \ Program Files \ Microsoft.NET \ SDK \ Compactframework \ v3.5 \ Debugger \ BCL \ mscorlib. dll (92 0kB)
Diese Dateien haben unterschiedliche Implementierungen für System.Object.GetHashCode(). Ersteres ist einfach leer während letztere sieht wie folgt aus:
public virtual int GetHashCode()
{
return EE.Object_GetHashCode(this);
}
In der Tat alle Methoden in der ehemaligen Datei leer zu sein scheinen und die viel kleinere Größe scheint in die Richtung anzudeuten, dass die ehemalige Datei ist nur ein Platzhalter, damit VS etwas referenzieren kann?
Zuletzt habe ich versucht, mscorlib.dll in den Dateien auf dem Emulator zu finden, aber fehlgeschlagen. Die Installer-Protokolldatei sagt, der Installationsort ist \ Windows, aber es gibt keine mscorlib.dll irgendwo. Wo ist das Zeug?
Im Allgemeinen habe ich eine harte Zeit googeln für Antworten, wenn es um die CF kommt, nicht sicher warum?
P.S. Ich versuche eine Antwort auf die this Frage zu finden.
Sind Sie sicher, dass es die richtige Version von mscoree.dll findet? –
Nein, bin ich nicht. Um ehrlich zu sein, bin ich relativ neu in der Entwicklung von Smart Devices und dem CF und verstehe vielleicht einige grundlegende Dinge über Retargetibility und wie CF-Entwicklung funktionieren soll, etc. Siehe oben für Details (in ein paar Minuten) . –