Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C#, Excel, uvolňování/zavírání/ukončování souboru

Vždy, keď dostaneš referenciu na COM objekt, tak sa zvýši počet referencií na ten COM objekt. Po ukončení práce s COM objektom by si mal tento počet referencií znížiť volaním metódy Marshal.ReleaseComObject (silno odporúčam prečítať časť Remarks). Keď počet referencií dosiahne nulu, COM objekt sa uvoľní z pamäte. Takémuto spôsobu sa vo všeobecnosti hovorí reference counting.

A teraz tá zábavnejšia časť. Ak chceš napríklad otvoriť zošit, tak by sa ti mohlo zdať ako dobrý nápad robiť to takto:

var workbook = application.Workbooks.Open(...)
A to je zle. Je to mimochodom dosť častá chyba ľudí, ktorí s tým nemajú skúsenosti. Pretože keď si získal referenciu na COM objekt Workbooks, tak sa zväčšil aj počet referencií na ten COM objekt. Ale ten objekt si si nikde neuložil, takže mu nemôžeš znížiť počet referencií volaním metódy Marshal.ReleaseComObject. Objekt sa uvoľní až po zbehnutí garbage collectora (GC) pri uvoľňovaní pamäte. A keďže samotná referencia (RCW) je z pohľadu GC len pár bajtov (na rozdiel od samotného COM objektu), tak to môže byť dosť nepríjemné.

Správne sa to robí tak, že nikdy nepoužívaš dve bodky v jednom príkaze. Každý jeden prístup k nejakej vlastnosti, ktorá nie je primitívneho typu, musí byť priradený do nejakej premennej, ktorú neskôr uvoľníš pomocou metódy Marshal.ReleaseComObject. Ideálne je napísať si na to nejaký wrapper, ktorý implementuje rozhranie IDisposable, a používať ho v bloku using. Plus si pozri ešte, čo je to late binding, a vyhneš sa aj problémom s rôznymi verziami Excelu.

Ak aplikáciu nechceš zatvoriť, tak nevolaj metódu Quit, ale určite použi Marshal.ReleaseComObject.

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny