Implicit metódusadék-fordítások a .NET interopban
A programozási nyelv agnosztikus állapotának megőrzése érdekében a Windows COM rendszer és számos Windows API egy 4 bájtos egész számot ad vissza, amely HRESULT
jelzi, hogy egy API sikeres vagy sikertelen volt-e, valamint néhány információt a hibáról. A hívónak átadni kívánt egyéb értékek a "out" paraméterként működő mutatóparamétereken keresztül "visszaadhatók", és általában az aláírás utolsó paramétere. Az olyan nyelvek, mint a C# és a Visual Basic, hagyományosan kivételként fordítanak le egy hibakódot, hogy megfeleljenek a hibák nyelv szerinti propagálásának, és elvárják, hogy az interop metódus aláírásai ne tartalmazzák a HRESULT
. Ha a metódusaláírást natív aláírásra szeretné lefordítani, a futtatókörnyezet egy további "out" paraméterre helyezi át a metódus visszatérési értékét egy újabb indirektségi szinttel (más szóval a felügyelt aláírás visszatérési típusára mutató mutatóvá), és egy visszatérési HRESULT
értéket feltételez. Ha a felügyelt metódus visszaadjavoid
, a rendszer nem ad hozzá további paramétert, és a visszatérési érték lesz .HRESULT
Lásd például az alábbi két C# COM metódust, amelyek ugyanazt a natív aláírást fordítják le:
int Add(int a, int b);
void Add(int a, int b, out int sum);
HRESULT Add(int a, int b, /* out */ int* sum);
PreserveSig a COM-ban
A C# összes COM-metódusa alapértelmezés szerint a lefordított aláírást fogja használni. Ha az aláírás fordítása és az értékek kezelése HRESULT
nélkül szeretne metódusokat használni és exportálni, adja hozzá egy PreserveSigAttribute COM-felületi metódushoz. Amikor az attribútumot egy metódusra alkalmazza, a rendszer nem végez fordítást az aláíráson, és a rendszer nem ad kivételeket a hibás HRESULT
értékekhez. Ez a beépített COM-ra és a forrás által létrehozott COM-ra is vonatkozik. Lásd például a következő C# metódusaláírást egy PreserveSig
attribútummal és annak megfelelő natív aláírásával.
[PreserveSig]
int Add(int a, int b, out int sum);
HRESULT Add(int a, int b, int* sum);
Ez akkor lehet hasznos, ha a metódus különböző HRESULT
értékeket ad vissza, amelyek nem hibák, de másképpen kell kezelni. Előfordulhat például, hogy egyes metódusok akkor adnak vissza értéket S_FALSE
, ha egy metódus nem hiúsul meg, hanem csak részleges eredményeket ad vissza, és S_OK
az összes eredményt visszaadja.
PreserveSig
P/Invokes használatával
Az DllImportAttribute attribútum a bool PreserveSig
mezőhöz hasonlóan PreserveSigAttribute
működik, de alapértelmezés szerint a következő.true
Annak jelzéséhez, hogy a futtatókörnyezetnek le kell fordítania a felügyelt aláírást, és kezelnie kell a HRESULT
visszaadott aláírástfalse
, állítsa a mezőt a PreserveSig
DllImportAttribute
. Lásd például két P/Invokes azonos natív metódushoz tartozó alábbi aláírását, az egyiket PreserveSig
az alapértelmezett értékre false
állítja, a másikat pedig az alapértelmezett true
értékre.
[DllImport("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true, PreserveSig = false)]
public static extern void SHAutoComplete(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);
[DllImport("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true)]
public static extern int SHAutoCompleteHRESULT(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);
Feljegyzés
A forrás által létrehozott P/Invokes, amelyek a LibraryImportAttribute, nem PreserveSig
rendelkeznek mezővel. A létrehozott kód mindig feltételezi, hogy a natív és a felügyelt aláírás azonos. További információ: Forrás által létrehozott P/Invokes.
Értékek manuális kezelése HRESULT
Ha olyan metódust PreserveSig
hív meg, amely egy hibát ad vissza HRESULT
, a ThrowExceptionForHR metódussal kiadhatja a megfelelő kivételt, ha az HRESULT
hibát jelez. Hasonlóképpen, egy PreserveSig
metódus megvalósításakor a GetHRForException metódussal visszaadhatja a HRESULT
kivétel megfelelő értékét jelző értéket.
Marshal HRESULTs asstructs
Metódus int
használata PreserveSig
esetén a rendszer várhatóan a felügyelt típus lesz a következőhözHRESULT
: . Ha azonban egy egyéni 4 bájtos szerkezetet használ a visszatérési típusként, akkor olyan segédmetó módszereket és tulajdonságokat határozhat meg, amelyek egyszerűbbé teszik a munkát a HRESULT
. A beépített rendezés során ez automatikusan működik. Ha a forrás által létrehozott rendezés felügyelt reprezentációja int
HRESULT
helyett egy parancsot szeretne használni, adja hozzá az MarshalAsAttribute attribútumot Error argumentumként. Ennek az attribútumnak a jelenléte újraértelmezi a szerkezet bitjait HRESULT
.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: