Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Office/Excel Interop vraag

Pagina: 1
Acties:

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
Hallo tweakers,

Voor een project maak ik gebruik van de MS Excel Interop librairy.
Alles werkt naar behoren, op 1 klein detail na:

Wanneer ik alle COM objecten weer heb gereleased en op null gezet en de expliciet de GC heb laten draaien (ook de WaitForPendingFinalizers method), blijft het EXCEL.EXE proces gedurende de lifespan van mijn applicatie geopend.

Is dit normaal?

Ik weet 100% zeker dat alle objecten gereleased worden, want als ik 1 object niet release, dan blijft het Excel proces draaien zelfs na het sluiten van de app.

Verwijderd

Volgens mij is dat normaal. De COM objecten schoppen excel.exe wel aan, maar kunnen en mogen 'm niet afsluiten omdat ze niet weten of er nog andere COM objecten bestaan die die exe benaderen.
Alleen je applicatie kan dat, omdat de excel instance in de user space van je applicatie is gestart. En wanneer die user space ophoudt te bestaan geldt dat ook voor alle instances binnen die space.

Ik kan me in de verklaring ook 100% vergissen hoor, maar dit is de verklaring waar ik mee heb leren leven. :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
code:
1
Marshal.ReleaseComObject

should do the trick. :)
Every time a COM interface pointer enters the common language runtime, it is wrapped in an runtime callable wrapper. If you are unfamiliar with the features of this wrapper, see Runtime Callable Wrapper.

This method is used to explicitly control the lifetime of a COM object used from managed code. You should use this method to free the underlying COM object that holds references to resources in a timely manner or when objects must be freed in a specific order.

The runtime callable wrapper has a reference count that is incremented every time a COM interface pointer is mapped to it. The ReleaseComObject method decrements the reference count of a runtime callable wrapper. When the reference count reached zero, the runtime releases all its references on the unmanaged COM object, and throws a System.NullReferenceException if you attempt to use the object further. If the same COM interface is passed more than once from unmanaged to managed code, the reference count on the wrapper is incremented every time and calling ReleaseComObject returns the number of remaining references.

[ Voor 90% gewijzigd door whoami op 23-08-2007 22:42 ]

https://fgheysels.github.io/


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
whoami schreef op donderdag 23 augustus 2007 @ 22:41:
code:
1
Marshal.ReleaseComObject

should do the trick. :)
duh ;)
zo ver was ik ook ;)

Ik heb 1 en ander aangepast en nu werk het wel!
Het enige dat ik veranderd heb ik het releasen van de objecten in een finally statement gezet, wat niets uit zou moeten maken, aangezien er geen exceptie gegooid wordt in de method (dat weet ik zeker)...

nouja.. vreemd:)
toch bedank!!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
Ah, en dat moet ik weten doordat .... Je vermeld nergens in je topicstart dat je dit gebruikt / getest hebt...
Dus, een beetje minder noten op de zang aub.

https://fgheysels.github.io/