Laden...

Laufende Visio Applikation holen

Erstellt von shredhead vor 16 Jahren Letzter Beitrag vor 15 Jahren 3.232 Views
S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren
Laufende Visio Applikation holen

Hallo Leute

Ich habe ein mittelschweres Problem! 🙂 In einem großen Softwareprojekt holen wir uns an einer Stelle die laufende Visio Applikation. Das funktioniert auch wunderbar, nur leider dauert es bei ca. jedem 2. Aufruf (des Programms) immer exakt 15 Sekunden(!!!) bis er den Befehl (die Visio Applikation zu holen) ausgeführt hat.

Dieser Fehler tritt nur beim Programmstart auf - d.h. wurde die Applikation einmal geholt, dann geht es danach immer schnell (auch wenn das Visio Objekt neu erstellt wird).

Interessanterweise haben wir dieses Verhalten nur beim Visual Studio 2005 festgestellt (mit SP1 und ohne). Im Visual Studio 2003 funktioniert es einwandfrei.

Das Verhalten zeigt sich auch in folgendem kleinen Testprojekt (Windows Application):


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace Start
{
    public partial class Form1 : Form
    {
        private Microsoft.Office.Interop.Visio.Application m_cVisioApp;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            // Laufende Visio Applikation holen
            m_cVisioApp = (Microsoft.Office.Interop.Visio.Application)
       System.Runtime.InteropServices.Marshal.GetActiveObject("Visio.Application");
            
            MessageBox.Show("Visio Applikation geholt!");
        }
        
    }
}

Startet man die Applikation und drückt auf den Button, dann geht es in ca. 50% der Fälle sofort und die MessageBox erscheint (man merkt also keine Zeitverzögerung), in den anderen 50% der Fälle dauert es exakt 15 Sekunden, bis die Abarbeitung beendet ist. Dieses Verhalten tritt nur auf, beim ersten Klick auf den Button. Ist die Applikation einmal geladen geht alles gut.
Ein höchst nichtdeterministisches Problem - und das interessanterweise nur im Visual Studio 2005 (sowohl mit als auch ohne SP1 und natürlich in .Net 2.0).

Weiß da jemand Rat - oder können wenigstens andere den Fehler reproduzieren?

Vielen Dank.

Gruß
Jörg

S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren

Hi Leute

Erstmal frohe Ostern! 🙂
Konnte schon Jemand den Fehler reproduzieren - oder hat sogar schon Jemand eine Idee woran es liegen könnte?

Jede Rückmeldung bringt mich einen Schritt weiter! 😉

Gruß
Jörg

3.728 Beiträge seit 2005
vor 16 Jahren
Image erzeugen

Tritt der fehler nur beim Debuggen in Visual Studio oder auch bei manueller Ausführung der EXE-Datei auf?

Mir hat es manchmal schon geholfen, die .NET Assemblies beim Installieren auf den Ziel-Clients (z.B. als Aktion des Setup-Projekts) mit ngen.exe vorkompilieren zu lassen. Damit entfällt die JIT-Kompilierung beim starten und die .NET Anwendungen sind "sofort" schnell. Das klassische warten beim ersten Klick entfällt.

Wenn es aber ganze 15 Sekunden sind, stimmt möglicherweise an Visio was nicht. Lädt Visio vielleicht irgendwelche Dritthersteller-Add-Ins? Dauert es auf allen Rechnern 15 Sekunden oder nur auf Deinem Entwicklungs-PC?

Stehen im Windows-Ereignisprotokoll vielleicht zufällig Fehler vom .NET Runtime Opimization-Dienst?

S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren

Hi Rainbird

Der Fehler tritt sowohl in der Debug als auch in der Release Version auf (auch bei manueller Ausführung - also nicht über VS 05).

Das mit dem vorkompilieren wäre mal eine Option zum ausprobieren - aber 15 Sekunden Wartezeit lassen sich damit sicherlich nicht erklären - das ist einfach zu lange.

Könnte natürlich mit Visio zusammenhängen - aber ich sagte ja bereits, dass der Fehler nur auftritt wenn der Code unter Visual Studio 2005 kompiliert wird. Der Fehler tritt nicht auf, wenn er unter Visual Studio 2003 ausgeführt wird. Ich spreche jetzt vom obigen Beispielcode - der "richtige" Code kann natürlich nicht in VS 2003 kompiliert werden, weil wir in .NET 2.0 entwickeln.

Und ja: Diese 15 Sekunden Wartezeit tritt auf allen Rechnern auf, nicht nur auf meinem!

Konntest du denn das beschriebene Verhalten mit obigem Code verifizieren?
Wir benutzen Visio 2003!

Gruß
Jörg

S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren

Achso: Und ob Fehler im Windows Ereignisdienst stehen kann ich leider nicht überprüfen - habe diese Woche noch Urlaub. Aber das wäre auch mal ein Ansatzpunkt zum nachschauen.............

Gruß
Jörg

S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren

Hi

Noch ein Nachtrag:
Es stehen also auch keine Fehler vom .NET Runtime Opimization-Dienst im Windows Ereignis Protokoll.

Die ganze Sache wird noch viel abstruser, denn auch folgendes - noch kleineres - Beispiel erzeugt bei mindestens jedem 2. Aufruf dieses 15 Sekunden Timeout:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Start
{
    public partial class Form1 : Form
    {
               
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
             Microsoft.Office.Interop.Visio.Application cVisioApp;        
        }          
    }

Es wird also nichtmal die Visio Applikation geholt sondern nur ein Objekt von eben diesem Typ deklariert (ohne Initialisierung). Und trotzdem dauert es 15 Sekunden bis er überhaupt zu dieser Zeile kommt.

Kann Jemand dieses Verhalten auch bei sich feststellen oder weiß vielleicht sogar Jemand eine Lösung. Ich bin mit meinem Latein am Ende.

Gruß
Jörg

S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren

Ich benutze übrigens die Microsoft Visio 11.0 Type Library für Microsoft Visio 2003.
Das Beispiele kompiliere ich in MS Visual Studio 2005 (.NET 2.0).

Wäre nett wenn es mal Jemand testen könnte! 🙂

Gruß
Jörg

S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren

Ok, Problem ist nun gelöst.

Wir haben die Microsoft Visio 11.0 Type Library in der Version 4.11.3216 benutzt, welche Im GAC installiert war. Diese löste den Fehler (sprich das 15 Sekunden Timeout) aus, warum auch immer - wir wissen es nicht.

Benutzt man eine ältere Version dieser Type Library, nämlich die 4.11.0 Version, so tritt dieses Timeout nicht auf und alles läuft normal. Allerdings liegt das Application Objekt dann nicht mehr im Namespace "Microsoft.Office.Interop.Visio" sondern direkt unter "Visio" (die Angabe von "Microsoft.Office.Interop" entfällt also).

Wir können uns nicht erklären, was genau diesen Fehler verursacht hat - aber schön ist, dass er nun weg ist! 🙂 Falls Jemand noch Licht ins Dunkle bringen kann - nur zu! 🙂

Gruß
Jörg

3.728 Beiträge seit 2005
vor 16 Jahren
PIAs

Der Namensraum Microsoft.Office.Interop.Visio stammt von einer sogenannten Primary Interop Assembly. Das sind COM-Interop-Schnittstellen-Assemblies von Microsoft, die eigentlich dafür da sind, die Anbindung von .NET Applikationen an Office-Produkte komfortabler und einfacher zu gestalten. Gegenüber den standard COM-Interop-Assemblies, die z.B. Visual Studio beim einbinden einer COM-Bibliothek automatisch erzeugt, wurde bei PIA-Assemblies manuell Hand angelegt, um .NET Entwicklern eine besseres "Programmier-Erlebnis" zu bieten. Viele Methoden geben z.B. bei den PIAs die richtigen Typen zurück, statt nur object.

Bei den vielen Versionsproblemen die die Leute hier zum Thema Office melden, bin ich von den PIAs nur noch bedingt überzeugt. Das Ganze ist einfach viel zu anfällig und das Deployment ist die Hölle. Wir werden wohl erst Ruhe haben, wenn der ganze COM-Müll zusammen mit seiner DLL-Hölle vollständig untergegangen ist.

Wenns eine robuste Office-Anbindung werden soll, die per XCopy-Deployment hinterher überall läuft, dann gibt es nur einen vernünftigen Weg: Späte Bindung mit Reflection. Die ersten Aufrufe findet man noch umständlich, aber schnell stellt sich Routine ein und GetType().Invokemember(...) wird selbstverständlich. Aus dem Original Office-VBA-Objektkatalog kann man sich schnell Methoden und Klassennamen kopieren und vermeidet so Tippfehler (Manuelle IntelliSense 😉).

Die Assembly die einfach nur "Visio" als Namensraum hat, ist wahrscheinlich eine standardmäßige von Visual Studio erzeugte Interop-Assembly. Die Standard-Assemblies funktionieren auch sehr zuverlässig. Bei verschiedenen Versionen der betroffenen Office-Applikation höt die Zuverlässigkeit aber auch schon wieder auf. Wer Software mit Office-Anbindung kommerziell entwickelt/vermarktet kann sich eigentlich nicht leisten, eine bestimmte Version vorrauszusetzen. Wenn mans "nur" In-House braucht kann man das lockerer sehen. Aber spätestens beim nächsten Office-Upgrade ärgert man sich, dass man alles nochmal anfassen muss.

S
shredhead Themenstarter:in
19 Beiträge seit 2007
vor 16 Jahren

Danke Rainbird für die Aufklärung. Das macht die Sache um einiges klarer.

Ja mit Reflection ist so eine Sache, und du hast natürlich Recht, dass man versionsunabhängig natürlich besser fährt. Müssen wir uns nochmal überlegen, ob es wirklich sinnvoll bzw. mit vertretbarem Aufwand zu realisieren ist. Der Code ist ja schon "umständlicher" weil allgemeiner (bei der späten Bindung), aber da gewöhnt man sich sicherlich schnell dran, wie du auch schon sagtest!

Gruß
Jörg

H
212 Beiträge seit 2007
vor 15 Jahren

hallo zusammen 🙂

würd den treat gern noch mal öffnen 🙂

also mir geht es genau darum das ich auch die aktuelle visio Anwendung brauche.

Ich habe den oben genannten Code übernommen.

Er läuft auch komplett durch nur leider passiert gar nichts ausser das die messagebox am ende erscheint.

Nun meine Frage ist nun was mache ich falsch?

:rolleyes: 😁 😮

738 Beiträge seit 2007
vor 15 Jahren

wenn du nur den Code von oben übernommen hast, passiert auch sonst nichts außer dass du ein
"Microsoft.Office.Interop.Visio.Application"
Objekt hast. 😉

H
212 Beiträge seit 2007
vor 15 Jahren

danke danke 🙂
war mir schon fast wieder klar...

wie bekomm ich es denn hin das ich per button click die geöffnete visio anwendung angezeigt bekomme?

process.start hilft ja sicherlich nicht da es ja schon offen ist

EDIT: Bin leider noch anfänger im umgang mit visio und da es kein forum zu visio gibt muss ich leider hier mit so anfängerfragen kommen. So leit es mir tut 🙂

:rolleyes: 😁 😮

738 Beiträge seit 2007
vor 15 Jahren

ich kenn zwar die Visio API nicht wirklick, aber ich denk mal mit

cVisioApp.Visible = true;

kommst du schon weiter.

Im allgemeinen wird dir nicht anderes über bleiben, als die MSDN da genauer durchzuschauen:

http://msdn.microsoft.com/en-us/library/cc160740.aspx

http://msdn.microsoft.com/en-us/library/aa342186.aspx

H
212 Beiträge seit 2007
vor 15 Jahren

danke für deine antwort werds sofort mal ausprobieren 🙂

ne leider bin ich noch kein stück weiter gekommen. Da ich auch keine wirkliche hilfe zu visio gefunden hab aber deine links sehen sehr interessant aus die werd ich mir mal anschauen 🙂

:rolleyes: 😁 😮