2013-04-25 75 views
0

我想了解C#如何与C++/CLI一起工作。C++/CLI C#集成

我已经使用了一个现有的SDK,用于为我的本机应用程序生成插件并使用/ CLR选项编译它。这似乎工作得很好。

现在我想要做的就是暴露我的非托管类型为C#。

如果我有这样的现有结构:

typedef struct _arrayi 
{ 
    unsigned long *data; 
    int    size; 
    short   width; 
    short   element; 
} ARRAYI; 

struct api { 
    ARRAYI *someval 
    chart *username 
} 

我怎样才能安全地公开这些我管理的类型?

回答

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 

} 
+0

请的例子中,不使用'gcnew'用'marshal_context'。使用堆栈语义,以便在异常情况下正确清理它。 – 2013-04-26 18:27:55

1

除了采用C++/CLI方法之外,还有另一种称为pInvoke的方法。你可以像你为另一个本地消费者一样导出你的dll函数和结构体。您只需在C#中编写这些托管存根以便能够调用这些存根。例如,请看www.pinvoke.net。在这里你可以找到大多数Windows API函数和结构的很好的例子。

从上面提到的网站,看看WIN32_FIND_DATA