首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正确地将C++ long转换为C# int

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

Stack Overflow用户
提问于 2019-01-07 09:02:08
回答 2查看 732关注 0票数 5

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

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

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

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

MYCore头文件:

代码语言:javascript
复制
#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);
}

MYCore源文件:

代码语言:javascript
复制
#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);
    }
}

我使用.NET 4.7.2框架接口项目导出C++库功能:

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
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   
}

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-07 10:02:01

这个问题实际上被称为“将一个非托管的C++类命名为C#”。

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

代码语言:javascript
复制
[DllImport(coreDLL, EntryPoint = "?Iterate@TestClass@@XXX@X", CallingConvention = CallingConvention.ThisCall)]
public static extern int CallIterate(IntPtr instance, int n);

我的C++中的方法看起来是这样的:

代码语言:javascript
复制
MYCORE_API int CallIterate(TestClass * instance, int n)
{
    if (instance!= NULL) 
    {
        return instance->Iterate(n);
    }
}

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

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

我的解决方案现在很好。感谢所有的好的投入!

票数 1
EN

Stack Overflow用户

发布于 2019-01-07 10:02:20

您在C#中所做的工作在C++中也不起作用:

代码语言:javascript
复制
auto result = Iterate(42l);

导致编译器错误。

不能将参数1从“long”转换为“long&”

我认为有两种解决办法:

( a)更改C++代码

代码语言:javascript
复制
long TestClass::Iterate(long n)

(不作参考)

( b)更改C#代码

代码语言:javascript
复制
static extern int Iterate(ref int n);

(传递引用)并将其称为

代码语言:javascript
复制
int n = 42;
Console.WriteLine(Iterate(ref n));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54071236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档