正确地将 C++ long 转换为 C# int

acc*_*777 5 .net c# c++

我目前正在使用用非托管 C++ 编写的业务逻辑库开发 .NET Framework 4.7.2 应用程序。我需要使用非托管 C++

我需要使用 C++ 项目中的逻辑,不幸的是我无法正确转换程序的输入或输出参数。

当我输入 42,并且只想返回该值时,我得到的结果是 17582022。实际上应该是 42。

我的 C++ 代码如下所示:

MYCore 头文件:

#ifdef MYCORE_EXPORTS
#define MYCORE_API __declspec(dllexport)
#endif

#pragma once
#include <string>

using namespace std;

extern "C"
{
    class MYCORE_API TestClass
    {
    private:
        string name;
    public:
        TestClass(char*);
        long Iterate(long &n);
    };

    MYCORE_API TestClass* TestClass_Create(char* name);
}
Run Code Online (Sandbox Code Playgroud)

MYCore源文件:

#include "stdafx.h"

#include "MYCore.h"

TestClass::TestClass(char* n) 
{
    name = n;
}

long TestClass::Iterate(long &n) 
{
    return n;
}

extern "C"
{
    MYCORE_API TestClass * TestClass_Create(char* name)
    {
        return new TestClass(name);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 .NET 4.7.2 Framework Interface 项目导出 C++ 库功能:

namespace MYCore.Interface
{
    public static class MYProxy
    {
        private const string coreDLL = "my.core.dll";

        [DllImport(coreDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr TestClass_Create(string name);

        [DllImport(coreDLL, EntryPoint = "?Iterate@TestClass@@XXXXX@X", CallingConvention = CallingConvention.ThisCall)]
        public static extern int Iterate(int n);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的实际应用程序中,我进一步导入 dll 并使用如下逻辑:

public static void Initialize()
{
    var test = MYProxy.WrapperIterator_Create("test");

    var result = MYProxy.Iterate(42); // as a result I'm getting sth. like 17582022 instead of 42   
}
Run Code Online (Sandbox Code Playgroud)

您知道如何正确地将 int 输入从 C# 转换为 C++ 或反之亦然吗?

谢谢你!

acc*_*777 1

该问题实际上称为“将非托管 C++ 类编组为 C#”。

在我的 Proxy 类中,我创建了一个方法来调用实际实例方法:

[DllImport(coreDLL, EntryPoint = "?Iterate@TestClass@@XXX@X", CallingConvention = CallingConvention.ThisCall)]
public static extern int CallIterate(IntPtr instance, int n);
Run Code Online (Sandbox Code Playgroud)

我的 C++ 中的方法如下所示:

MYCORE_API int CallIterate(TestClass * instance, int n)
{
    if (instance!= NULL) 
    {
        return instance->Iterate(n);
    }
}
Run Code Online (Sandbox Code Playgroud)

要进一步阅读有关如何封送非托管 C++ 类的信息,我建议您阅读以下文章:

https://www.codeproject.com/Articles/18032/How-to-Marshal-aC-Class

我的解决方案现在工作正常。感谢所有好的意见!