WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

C# dll in MATLAB ohne NET.addAssembly

 

balljabon
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 07.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.08.2012, 08:56     Titel: C# dll in MATLAB ohne NET.addAssembly
  Antworten mit Zitat      
ich habe dll aus C# erzeugt. Um die Funktionen (Methode in Klasse) aus MATLAB und C (native code) aufrufen zu können, habe ich wrapper-funktion in C++/CLR (mix code) geschrieben. Dazu habe ich dann dll aus C++/CLR erzeugt.

Diese dll habe ich von MATLAB mit dem Befehl 'loadlibrary' geladen. Ich habe aber Fehlermeldung gekriegt.


hier sind mein Code

in C#

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
        public double addup(double a, double b)
        {
            return a + b;
        }
    }
}



Dann baue ich wrapper-funktion in C++/CLR (mix code) und habe dll erzeugt.

main.h

Code:
#ifndef MAIN_H
#define MAIN_H
#endif

using namespace ClassLibrary1;
using namespace System;
using namespace Runtime::InteropServices;

class __declspec(dllexport) cwrap
{
private:
   void* hMain;

public:
   cwrap();
   double add(double a, double b);
};

extern "C" __declspec(dllexport)  cwrap*  __cdecl createclass();
extern "C" __declspec(dllexport)  double __cdecl addup(cwrap* handle, double a, double b);


in main.cpp

Code:
#include <vcclr.h>
#using <mscorlib.dll>

#include "main.h"

cwrap::cwrap()
{  
   gcroot<Class1^> *pp = new gcroot<Class1^>();
   this->hMain = (void*)pp;
}

double cwrap::add(double a,double b)
{
   gcroot<Class1^> *pp = reinterpret_cast<gcroot<Class1^>*>(this->hMain);
   System::Double result = ((Class1^)*pp)->addup(a,b);
   double res = result;
   return res;
}


extern "C" __declspec(dllexport)  cwrap* __cdecl createclass()
{
   return new cwrap();
}


extern "C" __declspec(dllexport)  double __cdecl addup(cwrap* handle, double a, double b)
{  
   return handle->add(a,b);

}


in matlab

Code:
close all
clc
clear all

% DLL laden

if ~libisloaded('mixcodedll')
    hloadLibrary = loadlibrary('mixcodedll.dll', 'main.h')
end


libfunctions mixcodedll -full     % all functions in library are listed


% get class handle
h = calllib('mixcodedll','createclass')

%*********** An dieser Stelle stürzt MATLAB ab******************
calllib('mixcodedll','addup', h, 6,8)

% Library free
unloadlibrary mixcodedll


Fehlermeldung von MATLAB

Code:

Unknown Windows exception of type=e0434f4d was not caught.
------------------------------------------------------------------------
       Segmentation violation detected at Wed Aug 08 08:50:46 2012
------------------------------------------------------------------------

Configuration:
  MATLAB Version:   7.6.0.324 (R2008a)
  MATLAB License:   43928
  Operating System: Microsoft Windows XP
  Window System:    Version 5.1 (Build 2600: Service Pack 3)
  Processor ID:     x86 Family 6 Model 15 Stepping 6, GenuineIntel
  Virtual Machine:  Java 1.6.0 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode
  Default Encoding:  windows-1252

Fault Count: 1

Register State:
  EAX = 00d3ca1c  EBX = e0434f4d
  ECX = 00000000  EDX = 00000028
  ESI = 00d3caa8  EDI = 000b1580
  EBP = 00d3ca6c  ESP = 00d3ca18
  EIP = 7c812afb  FLG = 00000202

......
......
......
 



Ich weiss, dass die Klasse aus C# mit MATLAB ab 2009 direkt aufgerufen werden kann. Aber alle Funktionen müssen aus C(native code) aufgerufen werden können. Deswegen muss ich wrapper-Funktion in C++/CLR bauen.


danke im voraus für eure Hilfe
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 08.08.2012, 10:14     Titel:
  Antworten mit Zitat      
Hallo,

zunächst würde ich testen, ob die gewrappte .NET DLL in C++ ordnungsgemäß funktioniert. Ist das der Fall?

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
sayuri

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2014, 09:53     Titel: Warum nicht add.Assembly??
  Antworten mit Zitat      
Question Question
Weil ich mich mit demselben beschäftige: Warum kann man das dll, das aus C# erstellt wurde, nicht mit add.Assembly in Matlab laden und verwenden????
Bitte um kurze Erklärung Question Question Question Question Question
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.