Data trecuta am scris un post despre cum trebuie apelat IDisposable pentru fiecare obiect COM pe care il aveti.
Nu ar fi mai bine daca s-ar face automat prin IDisposable – ca sa utilizam usor using ?
Problema este duala
- De imitat obiectul respectiv cu proprietati si metode ( duck typing )
- De chemat Marshal.ReleaseCOMOject pe Dispose
O optiune este faci o noua clasa(care implementeaza IDisposable) care sa primeasca pe constructor obiectul respectiv si sa implementezi 1 si 2 direct( adica daca obiectul are proprietatea X, vei crea si tu proprietatea X si vei redirecta call-ul catre obiectul respectiv)
Ceva de genul
public string x{ get{ return _innerObject.x; } set{ _innerObject.x=value; } }
Totusi procesul este destul de dificil – sa emulati toate proprietatile / metodele…
Alta optiune este sa derivati din DynamicObject si sa emulati proprietatile / metodele prin TryGetMember/ TrySetMember/TryInvokeMember
Daca vreti codul , il aveti aici:
Ca utilizare ,e aproape usor:
using (dynamic a = new ComDisposable(new Application())) { using (dynamic ws = a.Workbooks) { using (dynamic w = ws.Add()) { using (var shs = w.Sheets) { using (var s = shs[1]) { //Worksheet a; using (var r = a.Range("A1")) { r.Value2 = "http://ignatandrei.github.io/ToolsAndUtilities/"; using (var f = r.Font) { f.Bold = true; } } } } w.SaveAs(fileName); w.Close(); } } a.Quit(); }
Am creat si un pachet de NuGet pentru asta:
https://www.nuget.org/packages/ReleaseComObjectDisposable/
Video la https://youtu.be/2qbAcSjL1gU