Dynamic and IDisposable and ReleaseComObject

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

  1. De imitat obiectul respectiv cu proprietati si metode ( duck typing )
  2. 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:

https://github.com/ignatandrei/ToolsAndUtilities/blob/master/VS2015/ComTest/ComDoneRight/ComDisposable.cs

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

Leave a Reply

Your email address will not be published. Required fields are marked *