0

我试图了解 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
}

如何安全地将这些公开给我的托管类型?

4

2 回答 2

1

本机类型对 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

}
于 2013-04-26T00:17:48.780 回答
1

除了采用 C++/CLI 方式之外,还有另一种称为 pInvoke 的方法。您导出 dll 函数和结构的方式与导出另一个本地使用者的方式相同。您只需在 C# 中编写这些托管存根即可调用它们。例如,请查看www.pinvoke.net。在这里,您可以找到大多数 Windows API 函数和结构的良好示例。

从上面提到的站点,看WIN32_FIND_DATA的例子

于 2013-04-26T00:25:29.370 回答