【问题标题】:can't pass C# int to unmanaged C++ DLL无法将 C# int 传递给非托管 C++ DLL
【发布时间】:2013-07-11 17:30:22
【问题描述】:

我不熟悉将 C# .exe 项目连接到本机 Visual-C++ DLL。

我不知道如何只传递一个简单的整数,以下代码会导致弹出错误提示“PInvoke ... unbalanced the stack”。

C++ DLL…………

 extern "C"
 {

__declspec(dllexport) void start_frame_generation(  int& test_num )
{
    Console::WriteLine ("test_num = " + test_num );
    }

C# ....................

    [DllImport("Ultrasound_Frame_Grabber.dll")]
public static extern void start_frame_generation(  ref int test_num );

    private void VNGuideViewForm_Load(object sender, EventArgs e)
    {

            int test_num = 123;
            start_frame_generation( ref test_num);
     }

【问题讨论】:

标签: c# visual-studio-2010 visual-c++ dll


【解决方案1】:

您需要像这样将CallingConvention = CallingConvention.Cdecl 添加到您的DllImport

[DllImport("Ultrasound_Frame_Grabber.dll", CallingConvention = CallingConvention.Cdecl)]

省略此声明将导致您看到的堆栈消息不平衡。

VS2010 之前的编译器假定为 CallingConvention.Cdecl,但从那时起,除非您调用 Win32 API 之一,否则您必须添加它。

【讨论】:

    【解决方案2】:

    pm100 是正确的。您需要告诉 p/invoke 编组器该函数正在使用 C 声明(而不是默认的 StdCall)。在 DllImport 属性中,添加以下参数:CallingConvention = CallingConvention.Cdecl

    各种调用约定决定了函数的参数如何放在堆栈上以及谁负责清理堆栈(函数调用者或被调用的函数)。如果使用错误的调用约定,函数完成后堆栈的大小将与预期不同,从而导致此错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多