我目前正在使用用非托管 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++ 或反之亦然吗?
谢谢你!
该问题实际上称为“将非托管 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
我的解决方案现在工作正常。感谢所有好的意见!