目前,我正在使用用非托管.NET编写的业务逻辑库开发一个C++框架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);
}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);
}
}我使用.NET 4.7.2框架接口项目导出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);
}
}在我的实际应用程序中,我进一步导入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
}您知道如何正确地将int输入从C#转换为C++,反之亦然?
谢谢!
发布于 2019-01-07 10:02:01
这个问题实际上被称为“将一个非托管的C++类命名为C#”。
在我的代理类中,我创建了一个调用实际实例方法的方法:
[DllImport(coreDLL, EntryPoint = "?Iterate@TestClass@@XXX@X", CallingConvention = CallingConvention.ThisCall)]
public static extern int CallIterate(IntPtr instance, int n);我的C++中的方法看起来是这样的:
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
我的解决方案现在很好。感谢所有的好的投入!
发布于 2019-01-07 10:02:20
您在C#中所做的工作在C++中也不起作用:
auto result = Iterate(42l);导致编译器错误。
不能将参数1从“long”转换为“long&”
我认为有两种解决办法:
( a)更改C++代码
long TestClass::Iterate(long n)(不作参考)
( b)更改C#代码
static extern int Iterate(ref int n);(传递引用)并将其称为
int n = 42;
Console.WriteLine(Iterate(ref n));https://stackoverflow.com/questions/54071236
复制相似问题