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