2016-04-21 3 views
0

Ich habe eine DLL-Datei mit SIMULINK Embedded Coder erstellt. (Systemzieldatei ist auf: ert_shrlib.tlc festgelegt.) Es wird erfolgreich in Model_win64.dll erstellt. Jetzt möchte ich es von Visual Studios beziehen.Hinzufügen einer nativen DLL-Datei von SIMULINK zu Visual Studios C#

Ich versuchte zunächst, mit dem „add reference“ Werkzeug bekam aber den folgenden Fehler: Ein Verweis auf ‚Dateipfad \ Model_win64.dll‘

ich dann um online für eine Lösung gesucht und diese ist immer Fehler Ursache durch die DLL-Datei eine native DLL ist, so sollte ich die DllImportAttribute Klasse https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

so ist der Code, den ich derzeit

using System; 
using System.Runtime.InteropServices; 

namespace GUI_Interface 
{ 
    class Main 
    { 
    [DllImport("Modbot_Model_win64.dll", CharSet = CharSet.Unicode)] 
    public static extern int[] MPC(double x, double y, double theta, double Vx, double Vy, double Vtheta); 

    public static BackgroundWorker test() 
    { 
     ints = MPC(0, 0, 0, 0, 0, 0); 
    } 
} 

haben zu verwenden und ich erhalte die Laufzeitfehler: Kann 'Rückgabewert' nicht marshalieren: Ungültige Kombination aus verwalteten/nicht verwalteten Typen. Ich habe versucht, über verwaltete/nicht verwaltete Typen zu lesen, aber ich kann mich einfach nicht darum kümmern, um dieses Problem zu lösen. Alle vorgeschlagenen Lösungen oder Informationen zu verwalteten/nicht verwalteten werden sehr geschätzt.

+0

Können Sie bekommen versuchen, Ihre exe ändern, dass er x64 ist? – tofutim

Antwort

0

Sie können nicht direkt int [] als Rückgabetyp verwenden. Es ist gelungen, aber die DLL zurückgegeben ist nicht.

Ändern Sie den Rückgabetyp auf "IntPtr", um einen Zeiger zu empfangen.

[DllImport("Modbot_Model_win64.dll", CharSet = CharSet.Unicode)] 
public static extern IntPtr MPC(double x, double y, double theta, double Vx, double Vy, double Vtheta); 

Dann Marshall Kopie der Daten verwenden

IntPtr ints = MPC(0, 0, 0, 0, 0, 0); 
int ret[] = new int[N]; //N is the number of elements 
Marshall.Copy(ints, ret, 0, N); 
+1

Ethan hat Recht, Sie müssen IntPtr verwenden, um die nicht verwaltete Antwort richtig zu behandeln, da der Typ nicht unbedingt ein CLR-unterstützter Typ ist. IntPtr wird auch korrekt 64 vs 32-Bit-Unterschiede behandeln. Warum nicht stattdessen die MatLab-COM-Bibliothek verwenden? https://www.mathworks.com/help/matlab/matlab_external/call-matlab-function-from-c-client.html – nterry