因此,我所擁有的是包含在* .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