c# - 通过委托(delegate)从 C++ 调用 C# 方法会导致反向参数

标签 c# c++ interop unmanaged

我正在尝试让 C++ 函数调用 C# 中窗体上的方法以更新 GUI。由于某些原因,来自 C++ 的函数调用以相反的顺序发送参数。

因此 UpdateDROCallback() 函数在使用 function(1.0, 2.0, 3.0) 调用时,第一个参数为 3.0,第二个参数为 2.0,最后一个参数为 1.0。

我在这里错过了什么?

[C#]

    public partial class Form1 : Form
    {
        delegate void DROUpdateDelegate(double x, double y, double z);
        DROUpdateDelegate m_DROUpdateDelegate;
        static DROUpdateDelegate s_DROUpdateDelegate;

        public Form1()
        {
            InitializeComponent();
            m_DROUpdateDelegate = new DROUpdateDelegate(UpdateDROCallback);
            s_DROUpdateDelegate = new DROUpdateDelegate(UpdateDRO);
        }

        private void btnGo_Click(object sender, EventArgs e)
        {
            int address = m_DROUpdateDelegate.Method.MethodHandle.GetFunctionPointer().ToInt32();
            TestDll.RegisterScaleUpdateCallback(address);
        }

        private static void UpdateDROCallback(double x, double y, double z)
        {
            s_DROUpdateDelegate(x, y, z);
        }

        private void UpdateDRO(double x, double y, double z)
        {
            BeginInvoke(
                new Action(
                    () =>
                    {
                        lblDROX.Text = x.ToString("0.0000");
                        lblDROY.Text = y.ToString("0.0000");
                        lblDROZ.Text = z.ToString("0.0000");
                    }));
        }
    }

TestDll.cs:

public static class TestDll
{
    (...)
    [DllImport("test.dll", EntryPoint = "RegisterScaleUpdateCallback")]
    public static extern void RegisterScaleUpdateCallback(int address);
    (...)
}

[C++]

频闪测试.h:

#pragma once
class StrobeTest
{
    typedef void (__stdcall *DROUpdate)(double x, double y, double z);

private:
    static DROUpdate s_CallbackFunction;
public:
    StrobeTest(void);
    ~StrobeTest(void);

    static void InitializeStrobe(void);
    static void MoveXAtSpeed(double velocity);
    static void CALLBACK RegisterScaleUpdateCallback(DROUpdate function);
};

频闪测试.cpp

(...)
void StrobeTest::RegisterScaleUpdateCallback(DROUpdate function)
{
    StrobeTest::s_CallbackFunction = function;
    StrobeTest::s_CallbackFunction(1.0, 2.0, 3.0);
}
(...)

最佳答案

显示TestDll的代码,特别是其中TestDll.RegisterScaleUpdateCallback的声明。会有因。确保调用约定匹配。

关于c# - 通过委托(delegate)从 C++ 调用 C# 方法会导致反向参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430024/

相关文章:

c# - 访问网络驱动器上的文件

c++ - 是否可以将文件从主机操作系统复制到在虚拟机中运行的 guest 操作系统? (不是文件夹共享)

c++ - 依赖最小化 C++

c# - .NET 中的互操作性受损?

java - 为什么我不能在 clojure 中绑定(bind) defrecord?

c# - 生成的 C# 代码中的 T4 缩进

c# - .NET 标准库中的 System.Runtime.CompilerServices

c# - 我可以获得内存映射文件的路径吗? (.NET 4.0)

c++ - HTTP 代理检测 HTTP 客户端断开连接

outlook - Lotus Notes(和 MS Outlook).ICS 事件取消