Fehlermeldung bei Verwendung eines UpdatePanel in einem WizardControl

Szenario

Ein ASP.NET-Ajax-UpdatePanel wird innerhalb eines ASP.NET-Wizard-Steuerelements verwendet. Genauer gesagt innerhalb eines WizardStep-Tags.

Fehlermeldung

Es trat beim Aufruf einer ASPX-Seite mit dieser Konstellation folgende Fehlermeldung auf:

Cannot unregister UpdatePanel with ID ‚myUpdatePanel‘ since it was not registered with the ScriptManager. This might occur if the UpdatePanel was removed from the control tree and later added again, which is not supported.

Parametername: updatePanel

Ursache

Wie ich nach langem Hin-und-her herausgefunden habe war folgender Code die Ursache (ja, Visual Basic.NET, shame on me, der Kunde will das so):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
MyWizard.DisplaySideBar = False
End Sub

Ich hatte also im Load-Ereignis der Seite, die das Wizard-Steuerelement enthalten hat die DisplaySideBar-Eigenschaft geändert.

Dies hat unmittelbar zu der oben beschriebenen Fehlermeldung geführt. Andere Eigenschaften, wie z.B. ActiveStepIndex, hatten nicht zu dem Fehler geführt und korrekt funktioniert.

Lösung

Eine Lösung die sich für mich als benutzbar erwiesen hat war, dass ich die DisplaySideBar-Eigenschaft deklarativ gesetzt habe. Also direkt im ASPX-Markup.

Das war aber für mich ungeeignet, da ich die Eigenschaft im Design-Modus auf True haben wollte und nur zur Laufzeit auf False.

Deshalb habe ich nach etwas längerem Ausprobieren herausgefunden, dass wenn ich die DisplaySideBar-Eigenschaft zu einem „früheren“ Zeitpunkt setze, diese korrekt funktioniert, ohne einen Fehler zu produzieren.

Und zwar im PreRender-Ereignis des Wizard-Steuerelements selbst:

Protected Sub MyWizard_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)
    MyWizard.DisplaySideBar = False
End Sub

Damit hat alles wie gewünscht funktioniert.

Fehlermeldung „Der Name components wird bereits von einem anderen Objekt verwendet“ im Windows Forms Designer

Verhalten

Beim Öffnen des Windows Forms Designers kommt eine Fehlermeldung

„Der Name components wird bereits von einem anderen Objekt verwendet“

Ursache

Der Designer hat wohl was zerschossen. Genaue Ursache unbekannt.

Lösung

Auf dieser Seite schreibt Microsoft selbst:

So beheben Sie diesen Fehler:
Notieren Sie sich den genauen Wortlaut der Fehlermeldung, und wenden Sie sich an den Microsoft-Produktsupport.

Das ist natürlich Quatsch. In meinem Fall habe ich festgestellt dass in der Designer-Codedatei Folgendes drin stand:

private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.components = new System.ComponentModel.Container();

Also zwei Mal die selbe Zeile.

Nachdem ich eine davon gelöscht habe und das Projekt neu kompilierte, ging’s wieder.

Zugriff von .NET-Anwendungen auf Jet unter 64-bit-Windows-Betriebssystemen

Verhalten

Beim Ausführen von .NET-Anwendungen die via OleDB auf Microsoft-Access-Datenbanken (.mdb) zugreifen, kommt unter 64-Bit-Betriebssystemen folgende Fehlermeldung:

The ‚Microsoft.Jet.OLEDB.4.0‘ provider is not registered on the local machine.

Ursache

Der Microsoft-Jet-Treiber für den Zugriff auf Microsoft-Access-Datenbanken existiert nur in einer 32-Bit-Version, auch auf 64-Bit-Betriebssystemen.

Es gibt keine 64-Bit-Version und scheinbar ist auch keine geplant.

Lösungen

In diesem Forum-Thread habe ich sowohl die Lösung für Windows-Anwendungen, als auch für ASP.NET-Webanwendungen gefunden. Dort für Visual Basic beschrieben, aber auch für C# anwendbar.

Windows-Anwendungen (Konsole und Windows Forms)

Für Windows-Anwendungen im Visual Studio den CPU-Typ der Projektkonfiguration der betroffenen Projekte so einstellen, dass „x86“ als Zielsystem eingestellt ist, so wie in diesem Posting erklärt und hier detailliert beschrieben.

Zitat:

There is not a 64 bit version of jet that is why you get that error. To force your app to use the 32 bit change the target cpu to x86 in the advanced compiler options.

Dazu Rechtsklick auf das Projekt im Solution Explorer, dann dort Properties auswählen und dort Registerkarte Build, Auswahlliste Platform Target. Dort dann „x86“ auswählen, zuvor stand dort vermutlich „Any CPU“ drin.

In meinen Tests hat es ausgereicht, wenn ich bei einem Projekt, das über mehrere DLLs verteilt war, die Hauptanwendung (also das Projekt der EXE-Datei) als „x86“ gekennzeichnet habe und die DLLs auf „Any CPU“ gelassen habe.

ASP.NET-Webanwendungen

Für Webanwendungen muss der IIS, also der Webserver vom 64-Bit-Modus in den 32-Bit-Modus umgeschaltet werden. Dies gilt dann für alle Websites. In diesem Posting wird das erwähnt, in diesem Microsoft-Knowledge-Base-Artikel wird es beschrieben.

Zitat aus dem Posting:

If you want to run your ASP.NET app in 32-bit mode then you have run IIS in 32-bit mode. In addition, you cannot run IIS in 32 and 64-bit mode at the same time.

Zusammenfassung

Alles in allem ist Microsoft Jet also ausschließlich in 32-Bit verfügbar. Das ist recht traurig; der Grund ist sicherlich darin zu sehen, die Entwickler weg vom „alten“ Microsoft Access/Jet, hin zum SQL Server 2005 (Express) zu bewegen.

Ich find’s doof und lästig.

Windows-Tipp: Ersetzen von Dateien mit „Nein, alle“ bestÄtigen, beim Kopieren von Dateien im Windows-Explorer

Wenn Ihr mehrere Dateien/Ordner mit dem Windows-Explorer kopieren wolle und eine Datei/ein Ordner bereits vorhanden ist, kommt folgende Meldung:

Was mir da immer gefehlt hat war eine „Nein, alle„-Schaltfläche, die alle Dateien überspringt die schon vorhanden sind und nicht mehr nachfragt.

Und tatsächlich, es ist ein Mechanismus eingebaut der das ermöglicht:

Wenn Ihr die Umschalttaste gedrückt haltet während Ihr mit der Maus auf die „Nein“-Schaltfläche klickt, dann entspricht das einem „Nein, alle“.

Ein paar XSLT-Snippets

Hauptsächlich für mich selbst, nachfolgend eine wachsende Sammlung von XSLT-Code-Snippets:

1.) Ein XML-Dokument 1:1 an die Ausgabe weiterreichen:

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output
        method="xml"
        indent="yes" />
    
    <xsl:template match="*">
        <xsl:element name="{name()}">
    
            <!-- all attributes. -->
            <xsl:for-each select="@*">
                <xsl:attribute name="{name()}">
                    <xsl:value-of select="current()" />
                </xsl:attribute>
            </xsl:for-each>

            <!-- recurse. -->
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

2.) Eine verschachtelte Struktur in eine flache Struktur umwandeln

Antwort auf meine Frage in einer Newsgroup dazu.

Die Sammlung wird wachsen.

Kleines Caspol-Tool

Ggf. könnt Ihr dieses kleine Tool von uns mal gebrauchen:

zetacaspol.exe, 150 kB

zetacaspol.exe

Das Tool dient dem automatischen anpassen von .NET-Sicherheitsrichtlinen indem es das caspol.exe-Hilfsprogramm von Microsoft aufruft.

Szenario/Hintergrund:

.NET-Windows-Forms-Anwendungen die auf einem Netzlaufwerk liegen erhalten standardmäßig weniger Rechte zum Ausführen.

Mit Hilfe von zetacaspol.exe könnt Ihr auf einfache Weise dafür sorgen, dass eine Anwendung „FullTrust“-Rechte erhält:

  1. zetacaspol.exe in den Netzwerk-Ordner kopieren in dem die zu berechtigende Anwendung liegt (z.B. „\\myserver\someshare\myapplication\bin“)
  2. Diesen Ordner in „Lokales Intranet“-Zone oder „Vertrauenswürdige Sites“-Zone hinzufügen
  3. zetacaspol.exe einmal aufrufen

zetacaspol.exe hat selbst keine Benutzeroberfläche und schreibt schlicht eine „zetacaspol.log“-Datei mit den ausgeführten Befehlen.

Es arbeitet mit den 32-bit- und 64-bit-Versionen des .NET Framework von Version 1.1. bis zur bis dato neuesten Version 3.5 zusammen.

Vorsicht bei „Debug.Assert“-Aufrufen in ASP.NET (2.0)-Webanwendungen!

Über vier Manntage hat mich insgesamt das folgende (in meinen Augen falsche) Verhalten von ASP.NET gekostet.

Beschreibung

  • Eine ASP.NET 2.0-Webanwendung läuft in der Testumgebung ganz normal und auch im Echtbetrieb.
  • Zu nicht-vorhersehbaren Zeiten „hängt“ die Anwendung auf einmal. D.h. die Anwendung reagiert für den Benutzer einfach nicht und der Browser lädt ewig.
  • Wenn ich dann den entsprechenden „w3wp.exe“ kille (ich habe extra einen AppPool nur für die eine Webanwendung gemacht), dann wird sofort automatisch ein neuer w3wp.exe gestartet und die Anwendung läuft wieder normal.

Ursache

Ein Aufruf von Debug.Assert in einer von der Webanwendung verwendeten DLL hat den Prozess zum Hängen gebracht.

  • Debug.Assert direkt in einer
    Webanwendung ausgeführt hält den „w3wp.exe“ nicht an, sondern wird
    schlicht ignoriert.
  • Debug.Assert indirekt
    in einer DLL, die von der Webanwendung verwendet wird, hält den
    w3wp.exe an und kann nur durch killen des „w3wp.exe“ beendet werden.

Lösung

Als schnellen Workaround habe ich jetzt alle Debug.Assert-Aufrufe in der DLL auskommentiert. Natürlich könnt Ihr auch schlicht alles im Release-Modus kompilieren, das ist aber in meinem Fall nicht nötig gewesen (keine Performance-Verbesserungen).

Den Microsoft Scripting Host in C# verwenden

Nachfolgend ein paar Anmerkungen zum den Erlebnissen und Erkenntnissen die ich beim Einbinden des Microsoft Scripting Host in eine C#-Windows Forms-Anwendung hatte.

Ressourcen

Zunächst sind folgende Ressourcen hilfreich:

  • Das Dr. Dobb’s Journal hat einige Artikel dazu veröffentlicht. Fragmente dazu stehen noch im Netz und sind bei Google zu finden.
  • Das Weblog von Eric Lippert enthält gute Infos zum Scripting Host im Allgemeinen.
  • Die Usenet-/Google-Group „microsoft.public.scripting.hosting“ enthält ebenfalls gute Infos.
  • Die eigentliche Schnittstellen-Definition ist z.B. im Platform-SDK-Ordner „c:\Programme\Microsoft SDK\Include\ActivSP.idl“ (so heißt er bei mir) zu finden.

Fehlermeldung „Klasse unterstützt keine Automatisierung“

Diese Fehlermeldung habe ich erhalten, als ich eigene C#-Klassen via IActiveScript.AddNamedItem hinzufügen wollte und diese Klassen nicht public waren oder nicht das ComVisible( true )-Attribut gesetzt hatten.

Als einfache Lösung also einfach schauen, dass die Klassen (inklusive aller Basisklassen) ComVisible( true ) und public sind.

Fehlermeldung „FatalExecutionEngineError“

FatalExecutionEngineError was detected
Message: Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: „0x7a0b2d09“ in Thread „0x29c“. Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können.

Diese Fehlermeldung habe ich erhalten, weil ich einen falschen Parameter für die Funktion IActiveScript.AddNamedItem übergeben hatte.

Und zwar habe ich das Flag „SCRIPTITEM_ISSOURCE“ angegeben. Als ich das Flag weggelassen habe, lief alles korrekt.

Dieses Flag gibt laut MSDN-Dokumentation an, dass das hinzugefügte Objekt als Senke für Skript-Ereignisse agieren soll. Scheinbar geht das nicht oder zumindest nicht so wie ich es gedacht habe.

Macht aber nix, brauche ich in meinem Fall nicht. Deshalb habe ich einfach das Flag weggelassen und gut war’s.

Generische Typen in COM verwenden

Klassen die direkt von generischen Basisklassen ableiten sind nicht in COM (also in Skripten im Windows Scripting Host) sichtbar. Es kommen dann seltsame Fehler wie „Method not found“ beim Aufruf von Methoden solcher Klassen.

Deshalb Klassen die von COM aus ansprechbar sein sollen immer von nicht-generischen Basisklassen ableiten.

Was bei mir funktioniert hat ist, wenn solche Klassen generische Schnittstellen implementieren (z.B. IComparable<T>). Die Klasse selbst ist also nicht generisch, nur eine implementierte Schnittstelle. Solch eine Klasse konnte ich erfolgreich von COM aus ansprechen.

Hier einige weiterführende Hinweise zu dem Thema:

  • Meine ursprüngliche Anfrage in den MSDN-Foren
  • „Interoperating Using Generic Types“ in der MSDN Library
  • „COM Interop with Whidbey Generics?“, Artikel von 2004 von Sam Gentile in seinem Weblog

Schnittstellendefinition

Weil ich lange gesucht habe, hier der Download der Schnittstellendefinitionen für folgende Schnittstellen und Enumerationen:

  • IActiveScript
  • IActiveScriptParse
  • IActiveScriptSite
  • IActiveScriptError
  • SCRIPTSTATE
  • SCRIPTTHREADSTATE
  • SCRIPTITEMFLAGS
  • SCRIPTINFOFLAGS

C#-Windows Forms-Designer-Fehlermeldungen in Visual Studio.NET 2005

(View this article in Google-translated English)

Dieser Artikel hier soll mein Versuch werden, verschiedene Fehlermeldungen im leider nicht perfekten C#-Windows Forms-Designer von Visual Studio.NET 2005 zu interpretieren und möglichst zu lösen.

Ich werde den Artikel nach und nach um alle im Laufe der Zeit bei mir so auftretenden Fehlermeldungen und möglichst auch Lösungen ergänzen.

1.) Fehlermeldungen aufgrund von Fehlern im eigenen Code

Der Windows Forms-Designer ruft auch während des Designens Code auf den Ihr geschrieben habt (Details habe ich nie erforscht, welchen und was er ausführt, aber zumindest der Konstruktor des Forms wird aufgerufen).

Deshalb kann es vorkommen, dass Code von Euch Ausnahmen werfen, die wiederum im Designer dann sichtbar werden und ein graphisches Arbeiten verhindern. Z.B. nachfolgendes Bildschirmfoto:


Bildschirmfoto 1: Fehlermeldungen im Form-Designer (Klick für Großbild)

Textuell kommt folgende Fehlermeldung:

Object reference not set to an instance of an object.

at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase. DeserializeAssignStatement( IDesignerSerializationManager manager, CodeAssignStatement statement )
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase. DeserializeStatement( IDesignerSerializationManager manager, CodeStatement statement )

Wichtig zu verstehen ist, dass es eine beliebige Fehlermeldung sein kann, nicht nur die hier oben angegebene Null-Referenz-Ausnahme.

In meinem Beispiel war folgendes die Ursache:

Ich habe in dem Form eine eigenes Benutzer-Steuerelement („UserControl“) verwendet, das im Designermodus eine Ausnahme ausgelöst hat, und zwar beim Zuweisen einer Eigenschaft.

Der Grund für diese Ausnahme im Steuerelement war, dass zur Laufzeit gewisse Ereignis-Behandlungsroutinen aufgerufen werden (z.B. das „Load“-Ereignis des Formulars) und in diesen Behandlungsroutinen dann Variablen initialisiert werden.

Im Designmodus werden diese Behandlungsroutinen nun eben nicht aufgerufen und die Variablen eben nicht initialisiert. Deswegen hat dann die Eigenschaft eine Ausnahme ausgelöst.

Auch wenn im Designer-Fenster keine genaue Fehlerposition angegeben wurde, so zeigte die „Error List“ die genaue Position an, und zwar in Form einer „Warning“ (siehe Bildschirmfoto oben).

Ein Doppelklick auf die „Warning“-Liste öffnete dann die „*.designer.cs“-Quelltextdatei und zeigte wo der Fehler war. In meinem Beispiel war das die Zeile

this.imageControl.ImageObjectID = null;

Ein beherzter Rechtsklick mit der Maus auf ImageObjectID und dann „Go to Definition“ öffnete dann den Quelltext der ImageObjectID-Eigenschaft meines Benutzer-Steuerelements im Editor. Darin war also irgendwo der Fehler.

Lösung:

Oftmals war es für mich gar nicht nötig den genauen Fehler zu lokalisieren, da dieser ja nur im Designmodus auftrat; zur Laufzeit verhielt sich die Anwendung korrekt.

Deswegen habe ich mir eine statische Methode geschrieben die prüft, ob ein Steuerelement im Designmodus ist:

/// <summary>
/// Checks whether a control or its parent is in design mode.
/// </summary>
/// <param name="c">The control to check.</param>
/// <returns>Returns TRUE if in design mode, false otherwise.</returns>
public static bool IsDesignMode(
  Control c )
{
  if ( c == null )
  {
    return false;
  }
  else
  {
    while ( c != null )
    {
      if ( c.Site != null && c.Site.DesignMode )
      {
        return true;
      }
      else
      {
        c = c.Parent;
      }
    }

    return false;
  }
}

Diese Funktion, zentral abgelegt, rufe ich immer dann auf, wenn ich einen Codeblock quasi für den Designmodus „auskommentieren“ möchte, also eben nicht ausführen.

Ein Bisschen ein Hack, aber sehr effektiv und funktionierend.

Alternative Lösung:

Wenn Eigenschaften nicht zur Laufzeit gesetzt werden müssen, folgende Attribute an die Eigenschaft anhängen:

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

Das sorgt dafür, dass der Designer die Eigenschaften komplett in Ruhe lässt.

Falls Ihr nachträglich diese Attribute setzt, müsst Ihr in den Designer-Dateien bereits vorhandene unnötige Zuweisungen zu den Eigenschaftswerten entfernen, damit es im Design-Modus funktioniert.

2.) Ein Form das im Designer geöffnet wird ist leer und zeigt keine Steuerelemente mehr an

Ich hatte einige wenige Male das Phänomen, dass ein bereits funktionierendes Formular mit zahlreichen Steuerlementen auf einmal beim Öffnen im Form-Designer komplett leer war.


Bildschirmfoto 2: Leeres Form im Form-Designer (Klick für Großbild)

Ein Blick in die „*.designer.cs“-Datei des Forms zeigte dann, dass ganz am Ende der Funktion InitializeComponent eine oder beide dieser Zeilen fehlte:

this.ResumeLayout( false );
this.PerformLayout();

Nachdem ich diese ergänzt hatte, das Form wieder geschlossen, neu kompiliert und geöffnet hatte, war alles wieder im Form-Designer vorhanden und auch zur Laufzeit voll funktionsfähig. Manchmal reicht auch schlicht das Ergänzen der fehlenden Zeile, ohne ein Neukompilieren.


Bildschirmfoto 3: Korrekt gefülltes Form im Form-Designer (Klick für Großbild)

Die Ursache warum der Form-Designer den Code gelöscht hat ist mir leider unbekannt.

Bei meinen Fällen war danach auch der Code dauerhaft vorhanden. Jörg hat leider die Erfahrung gemacht, dass nach jedem manuellen Einfügen und Schließen der Datei, der Form-Designer den Code erneut gelöscht hat. Bei Jörg war es ein Formular mit sehr vielen Steuerelementen (ca. 200), ggf. könnte(!) das eine Ursache gewesen sein.

3.) Die Zuordnung der Eigenschaften Form.AcceptButton und Form.CancelButton gehen verloren

Relativ oft passiert es mir, dass ich einem Form im Form-Designer via Eigenschaftsfenster die Werte für Form.AcceptButton und Form.CancelButton zuweise (also die Schaltflächen die beim Benutzen der Eingabetaste bzw. der Escape-Taste ausgelöst werden) und irgendwann die Zuordnungen wieder verschwunden sind.

Die genaue Ursache kann ich leider nicht ermitteln, mir ist aber aufgefallen wenn ich Änderungen im Form-Designer Rückgängig mache (über Strg+Z oder den „Rückgängig“-Eintrag im „Bearbeiten“-Menü), die Zuordnung auch verschwindet. Ggf. hängt das damit zusammen.

Dieser Punkt ist jetzt nicht mission critical, aber dennoch lästig, weil es halt nicht sofort auffällt.

Manchmal bin ich jetzt dazu übergegangen, im Konstruktor eines Form, nach dem automatisch generierten Aufruf zu InitializeComponent() die Zuordnungen manuell hinzuschreiben, so dass diese dauerhaft erhalten bleiben.

4.) Die Schaltflächen (ToolStripItems) einer Werkzeugleiste (MenuStrip) werden nicht mehr dargestellt

Diesen Effekt hatte Kollege Thilo einmal gehabt, mit dem Ergebnis, dass die Werkzeugleiste komplett „leer“ dargestellt wurde.

Es ist nach einem Absturz der Visual Studio .NET 2005-IDE aufgetreten.

Im Endeffekt haben einige Zuordnungen in der „*.designer.cs“-Quelltextdatei gefehlt.

So sahen die relevanten Zeilen direkt nach dem Absturz aus:

...
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripSeparator1,
this.toolStripSeparator2,
this.toolStripSeparator3});
this.toolStrip1.Location = new System.Drawing.Point(0, 24);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(809, 25);
this.toolStrip1.TabIndex = 5;
this.toolStrip1.Text = "toolStripMain";
...

Und so die manuell korrigierte, wieder funktionierende Version:

...
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.btnPublish,
this.toolStripSeparator1,
this.btnPGedit,
this.btnPGadd,
this.btnPGdel,
this.toolStripSeparator2,
this.btnAGedit,
this.btnAGadd,
this.btnAGdel,
this.toolStripSeparator3,
this.btnAedit,
this.btnAadd,
this.btnAdel});
this.toolStrip1.Location = new System.Drawing.Point(0, 24);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(809, 25);
this.toolStrip1.TabIndex = 5;
this.toolStrip1.Text = "toolStripMain";
...

Thilo konnte das aus einer Sicherheitskopie (auch „Backup“ genannt) wiederherstellen.

An dieser Stelle mal der erneute Hinweis, wie wichtig Sicherheitskopien sind!

Ich „zippe“ mir immer mal wieder komplette Projektstände und speichere sie mit Datum versehen in einen Ordner (z.B. mit dem Dateinamen „myproject – 2006-07-18.zip“), so dass ich auch mehrere Schritte zurückgehen kann.

Siehe auch: Solving „Exception of type System.ComponentModel.Design.ExceptionCollection was thrown.“ error messages in Visual Studio .NET 2010 Windows Forms Designer

Fehlerhafte Microsoft JET-Installation reparieren

Um eine fehlerhafte Microsoft JET- oder Microsoft MDAC-Installation zu reparieren hat mir heute ein kostenloses Werkzeug geholfen:

CSRepair“ von der Firma Macropool (hier der direkte EXE-Download).

Im konkreten Fall war es der Fehler

Das COM-Objekt mit der CLSID {DE88C160-FF2C-11D1-BB6F-00C04FAE22DA} ist ungültig oder wurde nicht registriert

Nach dem Ausführen des Werkzeugs war der Fehler behoben.

Update 27.04.2017

Die Links oben zu CSRepair sind tot, deshalb habe ich sie entfernt. Eventuell hilft dieses Tool von Microsoft weiter.

Siehe auch meinen Artikel zum Reparieren von JET-Dateien.