[C#]ActiveX component unload niet

Pagina: 1
Acties:

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
Ik gebruik een ActiveX/COM component, maar het unloaden ervan werkt niet.
(Het betreft een ActiveX/COM component, geen control. Het ding is dus niet afgeleid van AxHost om in een Form getoond te worden of iets dergelijks)
De component is een .exe. Wanneer ik de form terug zichtbaar maak, en het dan manueel sluit geeft ie me de waarschuwing dat ie als ActiveX server draait en dat alle programma's die de component gebruiken gesloten dienen te worden.
Er is geen Quit() methode of iets dergelijks aanwezig. Ook registeren voor de GC heeft (natuurlijk) geen zin.

samenvatting van interessante code
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ServiceLayer : IDisposable
{
  AxApp app;
  public MyClass()
  {
    // initialisatie gaat via een GlobalsClass
    GlobalsClass g = new GlobalsClass();
    app = g.Application();
    app.Visible = false;
  }

  public AxApp Application
  {
    get
    {
      return app;
    }
  }


  Dispose()
  {
     app.CheckForSavedObjects = false;
     app.KeepAlive = false;
     app = null;
  }
}

breakpoint plaatsen op de Application property toont me dat het ding niet opgevraagd wordt.
andere references lijken me dus uitgesloten.

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-04 17:18
Ik heb geen ervaring met activex stuff in c#, maar misschien helpt Marshal.ReleaseComObject wel.

https://fgheysels.github.io/


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
Dat was idd een groot stuk dichter naar de oplossing.
De code ziet er nu voor debugging als volgt uit:
C#:
1
2
3
4
5
6
7
8
AxApp.CheckForUnsavedObjects = false;
AxApp.KeepAlive = false;
AxApp.Visible = true;
AxApp.Clients = 0;

while (System.Runtime.InteropServices.Marshal.ReleaseComObject(AxApp) > 0);
AxApp = null;
GC.Collect();


nu is het zo dat slechts bij elke even run het object geunload wordt, dus de eerste keer draait het ding nog na stoppen, de 2de keer niet, 3de keer wel, etc...
Misschien maar eens wat verder gaan zoeken.

Ik heb ondertussen wat gelezen over de RunningObjectTable, misschien zoek ik straks nog even uit hoe ik die opvraag (enkel de UCOMIRunningObjectTable is in .NET beschikbaar, een implementerende klasse lijkt op het eerste zicht afwezig), bekijk ik daarvan de inhoud eens. Misschien vind ik daar wel een reden.

ASSUME makes an ASS out of U and ME


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
heb dit weekend niet kunnen aan deze code werken aangezien ik ze blijkbaar niet gecommit had op SVN.

heeft iemand echter een mogelijke oplossing voor het laatste probleem?

ASSUME makes an ASS out of U and ME


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
Ik heb nu geprobeerd om die RunningObjectTable uit te lezen, maar het COM object staat er niet in. (ook niet voor ik het release)

Ik begin wat radeloos te worden.

ASSUME makes an ASS out of U and ME


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
Ik begin te denken dat het probleem in de andere software ligt :|

de software durft namelijk na dereferencen als ActiveX component wel eens crashen met de melding:
"object or with-block variable not set"... een typische VB6 error dus...

Nochtans doet de software het wel goed vanuit Excel/VBA en co, maar daar gebeurt alles dan ook volautomatisch...
Zie ik dan iets over het hoofd ? :|

ASSUME makes an ASS out of U and ME

Pagina: 1