2016-04-21 61 views
0

我已經使用SIMULINK的嵌入式編碼器創建了一個.dll文件。 (系統目標文件設置爲:ert_shrlib.tlc)它成功構建到Model_win64.dll中。現在我想從Visual Studio中引用它。將來自SIMULINK的原生.dll文件添加到Visual Studios C#

我第一次使用「添加引用」工具嘗試,但得到了以下錯誤:參考,以「文件路徑\ Model_win64.dll」

然後我搜索周圍的解決方案在線和我得到這個錯誤是由該.dll文件是一個天然的.dll文件,所以我應該使用DllImportAttribute類​​

引起如此代碼我目前是

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

而且我得到的運行時錯誤:無法封送'返回值':無效的託管/非託管類型組合。我試過閱讀託管/非託管類型,但我無法繞過它來解決這個問題。任何建議的解決方案或託管/非託管信息將不勝感激。

+0

你可以嘗試改變你的exe文件,以便它是64? – tofutim

回答

0

您不能直接使用int []作爲返回類型。它的管理,但返回的DLL不是。

將返回類型更改爲「IntPtr」以接收指針。

[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是正確的,您需要使用IntPtr來正確處理非託管響應,因爲類型不一定是CLR支持的類型。 IntPtr也將正確處理64位和32位的差異。另外,爲什麼不使用MatLab的COM庫呢? https://www.mathworks.com/help/matlab/matlab_external/call-matlab-function-from-c-client.html – nterry

相關問題