none
Probleme bei Programmaufruf auf anderem PC mit anderer MATLAB-Version RRS feed

  • Frage

  • Hallo liebe Community!

     

    Ich habe bezüglich einer COM-Schnittstelle, die ich in mein Programm eingebunden habe. Es geht um den MATLAB COM Automation Server, den ich aus meinem Programm aufrufe und testweise einen Graph zeichnen lasse. Ich weiß, dass das wahrscheinlich ein MATLAB-spezifisches Problem ist, aber nachdem ich keine Antwort auf meinen Foreneintrag bei mathworks bekommen habe, möchte ich es hier zumindest versuchen, denn vllt liest sich aus der Fehlermeldung ein auch bei anderen Schnittstellen vorkommender Fehler heraus!

     

    Dieses hier ist mein Code:

     

    namespace matlab
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void button_startML_Click(object sender, EventArgs e)
        {
         
            MLApp.MLAppClass matlab = new MLApp.MLAppClass(); 
            matlab.Visible = 0;
            matlab.Execute("a = [ 1 2 3 ; 4 5 6 ; 7 8 9]");
            matlab.Execute("plot(a);");
          
        }
      }
    }
    

    Im Groben erzeuge ich ein Objekt meiner MLAppClass und übergebe der Methode "Execute" einen String, der dann wie ein MATLAB Input funktioniert.

     

    JETZT aber der Fehler: Obwohl es auf meinem PC und meinem Laptop (beide MATLAB Version 2009b 64-Bit) funktioniert,

    kommt bei meinem Kumpel mit 2008a 32-Bit folgender Fehler:

    [oh ich sehe gerade, dass man keine Bilder einfügen kann, richtig?!]

    Nehme dafür einfach die Dateiltextinformationen, die er rauskopiert hat:

    ************** Ausnahmetext **************
    System.Runtime.InteropServices.COMException (0x80040154): Die COM-Klassenfactory für die Komponente mit CLSID {947F5F87-749B-49AD-A5C0-17F10C5DEB16} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 80040154 Klasse nicht registriert (Ausnahme von HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
      bei matlab.Form1.button_startML_Click(Object sender, EventArgs e)
      bei System.Windows.Forms.Control.OnClick(EventArgs e)
      bei System.Windows.Forms.Button.OnClick(EventArgs e)
      bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
      bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
      bei System.Windows.Forms.Control.WndProc(Message& m)
      bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
      bei System.Windows.Forms.Button.WndProc(Message& m)
      bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    
    
    ************** Geladene Assemblys **************
    mscorlib
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
      CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
    ----------------------------------------
    matlab
      Assembly-Version: 1.0.0.0.
      Win32-Version: 1.0.0.0.
      CodeBase: file:///C:/Users/Schnaggels/AppData/Local/Apps/2.0/4OZ5A6PE.A27/JNV9X5M2.10N/matl..tion_925d864306512e01_0000.0000_50c3b215279f03f6/matlab.exe.
    ----------------------------------------
    System.Windows.Forms
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
    ----------------------------------------
    System.Drawing
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
    ----------------------------------------
    System
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
    ----------------------------------------
    System.Configuration
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
    ----------------------------------------
    System.Xml
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
    ----------------------------------------
    Interop.MLApp
      Assembly-Version: 1.0.0.0.
      Win32-Version: 1.0.0.0.
      CodeBase: file:///C:/Users/Schnaggels/AppData/Local/Apps/2.0/4OZ5A6PE.A27/JNV9X5M2.10N/matl..tion_925d864306512e01_0000.0000_50c3b215279f03f6/Interop.MLApp.DLL.
    ----------------------------------------
    mscorlib.resources
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
    ----------------------------------------
    System.Windows.Forms.resources
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
    ----------------------------------------
    
    ************** JIT-Debuggen **************
    Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
    Konfigurationsdatei der Anwendung oder des Computers
    (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
    Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.
    
    Zum Beispiel:
    
    <configuration>
      <system.windows.forms jitDebugging="true" />
    </configuration>
    
    Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
    Ausnahmen an den JIT-Debugger gesendet, der auf dem
    Computer registriert ist, und nicht in diesem Dialogfeld behandelt.
    

     

    Es wäre super, wenn mir jemand helfen könnte, da mir von Mathworks aus einfach keine Informationen bezüglicher Veränderungen in der COM-Schnittstelle bei Versionswechseln zur Verfügung stehen...

     

    Danke und beste Grüße,

     

    Nisse!

     

    Montag, 22. November 2010 16:14

Antworten

  • Hallo Nisse

    Gemäss Matlab selber:
    http://www.mathworks.com/support/solutions/en/data/1-BDIX7V/

      "they are version specific"

    Ob dies nun nur irgendwelche Metadata/Interop-Versionen betrifft, oder ob effektiv schon die COM-Interface Signaturen binär-inkompatibel sind, kann nur Matlab genau sagen/garantieren.
      (mind. müsste man die IDL Basis von beiden vergleichen, zB OleViewer Tool im SDK)

    Weil manchmal (aber kein .NET-Thema, sondern COM/Matlab, wenig Hoffnung mit obigem Link!)
    sind alte Interop-Assembly -Versionen gegen Neue kompatibel, dann müsstest du auf Entwickler-PC (nur) die ältere Matlab installiert haben und COM-Verweis darauf im Studio aufnehmen.

    Andernfalls musst du effektiv wie oben offiziell pro ML-Version eine Interop/PIA DLL-Assembly ausliefern.

    Alternativ, falls du genug Nerven+Zeit hast, könntest du auch die Late-Binding -Krämpfe versuchen, C# 4.0 'dynamic' oder klassisches .NET Reflection.
    Montag, 22. November 2010 16:50
  • Jede Matlab-Version hat eine eigene Interop-Version und ich müsste ALLE einbinden
    ....wenn ich einfach mein Projectfile an Kumpels schicken, die verschiedene Versionen habe und die bitte, ihre Schnittstelle hinzuzufügen?
    Nisse,
    wie mein Matlab-Link sagt,
    die Interop-Assemblies pro ML-Version müssten wohl/typisch erst in deinem Install/Setup 'integriert' sein
       (also nicht schon in deinem C# Projekt als Verweise, da ist meist nur genau 1 pro App OK, also deiner lokal installierten ML-Version)

    Es genügt dazu evtl, wenn deine 'Kumpels' in einem neuen (leeren) C# Projekt einmal auch den Verweis auf Matlab-COM machen und dir insbesondere alle generierte(n) Interop-DLLs zurücksenden.
      (aber ich wäre wg Matlab da wenig zuversichtlich)
    Montag, 22. November 2010 17:07
  • Nun rätst du und dein Link dazu mehrere Interop DLLs in die Installation einzubinden. Meine Frage ist nun: Ich habe eine clickonce-Applikation mit VS2010 und wo sollte ich dort die DLL einfügen und müsste die auch den Zusatz .deploy erhalten? Zudem, eine elementare Frage meinerseits: Die heißen dann ja alle Interop.MLApp.dll. Das kollidiert ja allein wegen des gleichen Namens, oder?
    Nisse,
    ja da wäre meist Zusatzlogik im Installer nötig.
    Ob dies mit ClickOnce machbar ist weiss ich gerade nicht, ich schätze mal nein
      (da man für solche Anforderungen häufiger gleich Studio ab Professional mit dem Windows-Installer nimmt).
    Möglicherweise müsste man mit ClickOnce bereits schon pro Matlab-Version separate Projekte deiner App erstellen  (ggf Source-code sharing [Linked] unter den Projekten).
    Dienstag, 23. November 2010 22:24

Alle Antworten

  • Achja, habe mir gerade überlegt, dass es Sinn machen würde noch ein bissl über die Einbindung zu sprechen:

     

    Ich gehe Rechtsklick auf Project -> Verweis hinzufügen -> COM -> MATLAB Application (Version 7.9) Type Library 

    Montag, 22. November 2010 16:21
  • Hallo Nisse

    Gemäss Matlab selber:
    http://www.mathworks.com/support/solutions/en/data/1-BDIX7V/

      "they are version specific"

    Ob dies nun nur irgendwelche Metadata/Interop-Versionen betrifft, oder ob effektiv schon die COM-Interface Signaturen binär-inkompatibel sind, kann nur Matlab genau sagen/garantieren.
      (mind. müsste man die IDL Basis von beiden vergleichen, zB OleViewer Tool im SDK)

    Weil manchmal (aber kein .NET-Thema, sondern COM/Matlab, wenig Hoffnung mit obigem Link!)
    sind alte Interop-Assembly -Versionen gegen Neue kompatibel, dann müsstest du auf Entwickler-PC (nur) die ältere Matlab installiert haben und COM-Verweis darauf im Studio aufnehmen.

    Andernfalls musst du effektiv wie oben offiziell pro ML-Version eine Interop/PIA DLL-Assembly ausliefern.

    Alternativ, falls du genug Nerven+Zeit hast, könntest du auch die Late-Binding -Krämpfe versuchen, C# 4.0 'dynamic' oder klassisches .NET Reflection.
    Montag, 22. November 2010 16:50
  • Hey Thomas,

     

    erstmal Danke für den Link, ich bin wohl nicht gut genug im Googeln, denn eigentlich hast du damit ja genau das Richtige gefunden.

    Ich muss sagen, dass ich nicht alles verstanden habe, AUSSER:

    Jede Matlab-Version hat eine eigene Interop-Version und ich müsste ALLE einbinden, damit es überall funktioniert.

    Das Problem darin ist, wie du schon mit deinem "(nur)" angedeutet hast: Ich müsste die gängigsten Versionen von MATLAB installieren und hinzufügen. Das ist allein von den Kosten und der Verfügbarkeit nicht möglich, das wären meiner Ansicht nach 2007 - 2010... Wobei? Könnte schon klappen, wenn ich einfach mein Projectfile an Kumpels schicken, die verschiedene Versionen habe und die bitte, ihre Schnittstelle hinzuzufügen? Oder geht das nicht so, wie ich es denke?! Muss ich im Code noch eine Versionsabfrage machen und ihm sagen, welche .dll er laden soll?

     

    Oh Gott oh Gott...

     

    Aber auf jeden Fall danke!

    Montag, 22. November 2010 16:55
  • Jede Matlab-Version hat eine eigene Interop-Version und ich müsste ALLE einbinden
    ....wenn ich einfach mein Projectfile an Kumpels schicken, die verschiedene Versionen habe und die bitte, ihre Schnittstelle hinzuzufügen?
    Nisse,
    wie mein Matlab-Link sagt,
    die Interop-Assemblies pro ML-Version müssten wohl/typisch erst in deinem Install/Setup 'integriert' sein
       (also nicht schon in deinem C# Projekt als Verweise, da ist meist nur genau 1 pro App OK, also deiner lokal installierten ML-Version)

    Es genügt dazu evtl, wenn deine 'Kumpels' in einem neuen (leeren) C# Projekt einmal auch den Verweis auf Matlab-COM machen und dir insbesondere alle generierte(n) Interop-DLLs zurücksenden.
      (aber ich wäre wg Matlab da wenig zuversichtlich)
    Montag, 22. November 2010 17:07
  • Hey Thomas,

     

    also habe mich etwas mit dem Thema beschäftigt und bezüglich der Aufwärtskompatibilität ( also meine Software mit ML 2010a) kann ich sagen: Auch dort gibt es den Fehler.

     

    Nun rätst du und dein Link dazu mehrere Interop DLLs in die Installation einzubinden. Meine Frage ist nun: Ich habe eine clickonce-Applikation mit VS2010 und wo sollte ich dort die DLL einfügen und müsste die auch den Zusatz .deploy erhalten? Zudem, eine elementare Frage meinerseits: Die heißen dann ja alle Interop.MLApp.dll. Das kollidiert ja allein wegen des gleichen Namens, oder?

     

    Vielen Dank,

     

    mfg Nisse!

    Dienstag, 23. November 2010 22:04
  • Nun rätst du und dein Link dazu mehrere Interop DLLs in die Installation einzubinden. Meine Frage ist nun: Ich habe eine clickonce-Applikation mit VS2010 und wo sollte ich dort die DLL einfügen und müsste die auch den Zusatz .deploy erhalten? Zudem, eine elementare Frage meinerseits: Die heißen dann ja alle Interop.MLApp.dll. Das kollidiert ja allein wegen des gleichen Namens, oder?
    Nisse,
    ja da wäre meist Zusatzlogik im Installer nötig.
    Ob dies mit ClickOnce machbar ist weiss ich gerade nicht, ich schätze mal nein
      (da man für solche Anforderungen häufiger gleich Studio ab Professional mit dem Windows-Installer nimmt).
    Möglicherweise müsste man mit ClickOnce bereits schon pro Matlab-Version separate Projekte deiner App erstellen  (ggf Source-code sharing [Linked] unter den Projekten).
    Dienstag, 23. November 2010 22:24