2013-04-25 78 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