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++/CLI C# Integration

原生类型在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
的示例