0

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.

+0

Sind Sie sicher, dass es die richtige Version von mscoree.dll findet? –

+0

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) . –

Antwort

2

Sie können einfach nicht annehmen, dass die Eintrittspunkte jemals die gleiche Ordinalzahl haben.In der Tat ist es unklug anzunehmen, dass sie in Versionen derselben DLL auch auf derselben Plattform gleich bleiben werden (was bedeutet, dass der Aufruf von Ordinal 29 auf dem Desktop in dieser Version funktionieren könnte, aber die Funktion in der nächsten Version könnte leicht verschoben werden) wenn es neu kompiliert und verlinkt wird). Berufung nach Ordnungszahl ist Weg, Weg, Weg zerbrechlich und riskant.

+0

Ich stimme zu, aber es schien die einzige Möglichkeit zu sein, die ich um das Problem herumhacken konnte (siehe die Frage, die in der P.S. verknüpft ist). Hast du einen Vorschlag, wie ich das vermeiden könnte? –

0

In Windows CE-Geräten befinden sich Win32-Funktionen nicht unbedingt in denselben DLL-Dateien wie ihre Desktop-Entsprechungen. Die meisten Funktionen befinden sich in coredll.dll. Versuchen Sie es zuerst. Wenn es nicht funktioniert, müssen Sie den Namen der DLL in einem Windows CE-Gerät finden. MSDN kann nützlich sein. Versuchen Sie auch die Dokumentation für Platform Builder.

+0

Object_GetHashCode ist nicht wirklich eine Win32-Funktion, oder? Es ist Teil des .NET-Kompakt-Framework (mscoree.dll). Wie kann mscorlib.dll (die anscheinend ein Teil der CF ist, die auf dem Gerät installiert wird) referenzieren und EE.Object_GetHashCode() aufrufen und ich kann nicht? Schaue ich mir die falschen Dateien an? –

0

Kann ich eine dumme Frage stellen? Warum versuchen Sie, P/Invoke Object.GetHashCode()? Wenn ich ein Objekt vom Typ Object habe, kann ich die Methode direkt aus verwaltetem Code aufrufen, keine P/Invoke notwendig.

+0

Ich muss unbedingt die Implementierung von Object.GetHashCode() unter ** alle ** Umstände aufrufen. Das heißt, auch wenn ich ein Objekt einer Klasse habe, die GetHashCode() selbst überschreibt (z. B. String). –

+0

Bedeutung, müssen Sie die Base Object.GetHashCode() eines Objekts, nicht seine klassenspezifische Überschreibung aufrufen? (Sorry, wenn ich dicht bin). Also ... Sie können nicht einfach ein Objekt auf Objekt werfen und GetHashCode so aufrufen? – CBono

+0

"Sie müssen die Base Object.GetHashCode() eines Objekts aufrufen, nicht seine klassenspezifische Überschreibung?" Genau. Das Umsetzen in Object funktioniert nicht, da GetHashCode virtuell ist. –

0

Haben Sie versucht, die DLL Dependency Walker mit der Prüfung? Zumindest sollten Sie "# 29" durch den Namen für die Funktion ersetzen können.

Verwandte Themen