C++/CLI C# Integration
本文关键字:Integration CLI C++ | 更新日期: 2023-09-27 18:10:52
我正在尝试理解c#如何与c++/CLI一起工作。
我使用了一个现有的SDK,用于为我的本地应用程序生成插件,并使用/CLR选项对其进行了编译。
现在我想做的是将我的非托管类型公开给c#。
如果我有现有的结构,如:
typedef struct _arrayi
{
unsigned long *data;
int size;
short width;
short element;
} ARRAYI;
struct api {
ARRAYI *someval
chart *username
}
我如何安全地将这些暴露给我的托管类型?
原生类型在c#中不可见。如果您想要将这些类型暴露给c#,请编写托管等效类型。例如
ref class ManagedArrayI
{
public:
property array<Byte> ^ Data;
property System::Int16 width;
property System::Int16 element;
}
ref class ManagedApi
{
public:
property System::String^ UserName;
property ManagedArrayI^ SomeVal;
}
void ManagedCallApi(ManagedApi^ foo)
{
marshal_context context;
api nativeFoo;
System::String^ userName=foo->UserName;
nativeFoo.username=(char*)context.marshal_as<const char*>(userName);
ARRAYI nativeBar;
nativeFoo.someval=&nativeBar;
//now copy properties of foo->SomeVal to nativeBar
//call native function with nativeFoo
}
除了采用c++/CLI方式之外,还有另一种称为pInvoke的方法。导出dll函数和结构的方式与导出另一个本机使用者的方式相同。你只需要在c#中编写这些的托管存根,以便能够调用它们。例如,请查看www.pinvoke.net。在这里你可以找到大多数Windows API函数和结构的好例子。
从上面提到的站点来看一下WIN32_FIND_DATA