Ich erstelle eine Bibliothek von Dienstprogrammen, die sowohl in einer Desktopumgebung als auch in einer Webumgebung verwendet werden können.
Es enthält einige Funktionen, von denen ich glaube, dass sie oft in meinen Anwendungen wiederholt werden, einschließlich Utility, um den MIME-Typ einer Datei nach ihrem Inhalt (nicht der Erweiterung) zu erhalten.
Die Dateien, die ich prüfen muss, sind die gebräuchlichsten (jpg, png, pdf, txt), also habe ich mich für die externe Methode FindMimeFromData
(link oben)
Die Methode funktioniert gut, mit Ausnahme der beiden falschen Mime-Typen JPG ( image/pjpg
) und PNG ( image/x-png
), die einfach durch eine Überprüfung vor der return-Anweisung gelöst werden können.
Die Bibliothek ist für die Plattform AnyCPU kompiliert, da sie auf Servern / Clients sowohl in 32 als auch in 64 Bit installiert werden muss.
Zum Zeitpunkt des Tests auf der Desktop-Umgebung funktioniert alles ordnungsgemäß für beide Anwendungen, die für x86 und x64 kompiliert wurden.
Beim Testen einer ASP.NET-Anwendung (eine leere Site mit einem HTTP-Handler für test) tritt ein Fehler vom Typ HRESULT auf, und der Debugger sagt mir, dass er keine weiteren Informationen bereitstellen kann.
Nach einigen Testkonfigurationen, einschließlich der Änderung der Identität des Pools im lokalen System (ohne Ergebnis), habe ich das Problem identifiziert:
Der Pool sollte 32-Bit-Anwendungen zulassen (siehe Bild oben).
Warum?
Es sollte nicht die dll urlmon.dll
des 64bit Systems laden, wo wir jetzt sind?
Das ist ein großes Problem, weil die Methode FindMimeFromData
von überall in diese Bibliothek aufgerufen werden kann:
Das Ergebnis ist, dass ein Aufruf dieser Methode durch eine andere Hilfsmethode diese Ausnahme auslösen kann und es daher schwierig macht, das Problem auch durch Debugging zu verfolgen.
Irgendwelche Ideen / Erfahrungen?
Betriebssysteme, die zum Testen verwendet werden
Desktop:
Web:
EDIT 2 (Frage gelöst)
Gelöst von Nose- ratio :
Der korrekte Typ der Parameter ppwzMimeOut
und pBC
muss System.IntPtr
anstelle von System.UInt32
sein.
Ich weiß, dass System.UInt32
Probleme in vollen 64-Bit-Web-Apps verursacht, aber ich weiß nicht warum.
Wenn jemand den Grund für diese Probleme kennt, kann man es in einem Kommentar besser erklären?
Vielen Dank im Voraus
Wenn Sie die pinvoke-Signatur aus der Antwort Ihrer verknüpften verwendet haben, ist sie dort wie folgt definiert:
%Vor%Ich würde lieber die Definition von pinvoke.net verwenden:
%Vor% Beachten Sie den Unterschied in den Typen für den Parameter ppwzMimeOut
und pBC
. Im ersten Fall ist System.UInt32
kein korrekter Typ für einen 64-Bit-Zeiger unter einer 64-Bit-Plattform. Für pBC
ist dies wahrscheinlich kein Problem (solange es NULL ist), aber es ist wichtig für ppwzMimeOut
.
Lesen Sie diese Implementierung , die korrekt zu sein scheint.
Tags und Links c# dllimport 32bit-64bit urlmon