Megosztás a következőn keresztül:


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 PreserveSigAttributemű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 PreserveSigDllImportAttribute. 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 intHRESULT 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