2016-04-21 46 views
0

SIMULINKのエンベデッドコーダーを使用して.dllファイルを作成しました。 (システムのターゲットファイルはert_shrlib.tlcに設定されています)Model_win64.dllに正常にビルドされます。今私はVisualスタジオからそれを参照したいと思います。SIMULINKからVisual Studioにネイティブの.dllファイルを追加するC#

私は最初の「参照を追加」ツールを使用してみましたが、次のエラーました:への参照を「ファイルパス\ Model_win64.dll」

私はその後、オンラインソリューションの周りを検索し、このことを取得していますエラーは、だから、コード、私が現在持っている

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); 
    } 
} 

であり、私が得るネイティブの.dllはので、私はDllImportAttributeクラス​​

を使うべきであること.dllファイルによって原因ですランタイムエラー:「戻り値」をマーシャリングできません:管理対象/非管理対象の型の組み合わせが無効です。私は管理型/アンマネージ型を読み込もうとしましたが、この問題を解決するために私の周りを頭で囲むことはできません。マネージド/アンマネージドに関する提案されたソリューションや情報は、非常に高く評価されます。

+0

を取得するにはマーシャルのコピーを使用できますか? – tofutim

答えて

0

戻り値の型としてint []を直接使用することはできません。それは管理されていますが、返されるDLLはそうではありません。

戻り値の型を "IntPtr"に変更してポインタを受け取ります。それはx64のであるように、あなたのexeファイルを変更してみてください

[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); 

次にデータ

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です。タイプが必ずしもCLRでサポートされているタイプではないため、アンマネージドレスポンスを正しく処理するためにIntPtrを使用する必要があります。 IntPtrは64ビットと32ビットの違いも正しく処理します。また、代わりにMatLabのCOMライブラリを使用してみませんか? https://www.mathworks.com/help/matlab/matlab_external/call-matlab-function-from-c-client.html – nterry

関連する問題