因此,我所拥有的是包含在* .dll中的C++ API,并且我想使用C#应用程序来调用API中的方法。将C++ API暴露给C#
到目前为止,我已经创建了一个C++/CLR项目,包括本地C++ API和管理,以创建一个“桥”类,它看起来有点像下面这样:
// ManagedBridge.h
#include <CoreAPI.h>
using namespace __CORE_API;
namespace ManagedAPIWrapper
{
public ref class Bridge
{
public:
int bridge_test(void);
int bridge_test2(api_struct* temp);
}
}
。
// ManagedBridge.cpp
#include <ManagedBridge.h>
int Bridge::bridge_test(void)
{
return test();
}
int Bridge::bridge_test2(api_struct* temp)
{
return test2(temp);
}
我也有具有到C++/CLR“Bridge.dll”的引用,然后使用包含内的方法C#应用程序。我有许多问题与此:
- 我无法弄清楚如何调用bridge_test2的C#程序中,因为它没有一个什么样的api_struct实际上就是知识。我知道我需要在某个地方编组对象,但是我在C#程序还是C++/CLR桥中执行?
- 这看起来像一个很暴露API中所有方法的啰嗦方式,有没有更容易的方式,我错过了? (不使用的P/Invoke!)
编辑:好了,我已经得到了现在的工作得益于以下反应的基础知识,但我的结构(称之为“api_struct2”在这个例子中)在C++的本机代码既有本地枚举和工会,如下所示:
typedef struct
{
enum_type1 eEnumExample;
union
{
long lData;
int iData;
unsigned char ucArray[128];
char *cString;
void *pvoid;
} uData;
} api_struct2;
我想我已经找到了如何让枚举工作;我已经在托管代码中重新声明了它,并且正在执行“native_enum test = static_cast(eEnumExample)”以将托管版本切换为本机。
然而,工会让我难住,我不太确定如何攻击它..想法任何人?
那么这是否意味着我在C++/CLI * .dll或C#代码本身中创建了managed_api_struct?另外,我认为只要您使用StructLayout属性,就可以将托管结构传递给本机代码? – Siyfion 2010-04-12 07:43:28
这并不重要,但C++/CLI可以避免循环依赖。是的,[StructLayout]可以工作,但是你必须使用Marshal :: StructureToPtr()调用。托管结构的布局不可预测。 – 2010-04-12 10:26:18
好的,谢谢,我现在就去看看,看看我在哪里。 – Siyfion 2010-04-12 13:10:11