【问题标题】:Adding a Native .dll file from SIMULINK to Visual Studios C#将本机 .dll 文件从 SIMULINK 添加到 Visual Studios C#
【发布时间】:2016-08-15 08:59:22
【问题描述】:

我使用 SIMULINK 的嵌入式编码器创建了一个 .dll 文件。 (系统目标文件设置为:ert_shrlib.tlc) 成功构建到Model_win64.dll。现在我想从 Visual Studio 中引用它。

我第一次尝试使用“添加引用”工具,但出现以下错误:A reference to 'file path\Model_win64.dll'

然后我在网上搜索了一个解决方案,发现这个错误是由 .dll 文件是本机 .dll 引起的,所以我应该使用 DllImportAttribute Class https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

所以我目前的代码是

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

我得到运行时错误:无法封送“返回值”:无效的托管/非托管类型组合。我尝试阅读托管/非托管类型,但我无法包装我的围绕它来解决这个问题。任何关于托管/非托管的建议解决方案或信息将不胜感激。

【问题讨论】:

  • 您可以尝试将您的 exe 更改为 x64 吗?

标签: c# c++ .net visual-studio-2012 dll


【解决方案1】:

您不能直接使用 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);

然后使用 Marshall 拷贝获取数据

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

【讨论】:

  • Ethan 是对的,您需要使用 IntPtr 正确处理非托管响应,因为该类型不一定是 CLR 支持的类型。 IntPtr 还将正确处理 64 位与 32 位的差异。另外,为什么不使用 MatLab 的 COM 库呢? mathworks.com/help/matlab/matlab_external/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
相关资源
最近更新 更多