2015-09-09 108 views
2

我已重寫數組訪問([])C#項目,像這樣重載C#數組訪問:調用從非託管C++/CLI

Foo.cs:

public override FooItem this[long index] { 
    ... 

編譯該項目轉換成我的C++/CLI項目引用的.dll文件。

我有一個非託管C++/CLI類,FooAccess:

FooAccess.h:

class FooAccess : NativeCPPClass { // not ref class 
private: 
    gcroot<CSDll::Foo^> myFoo; 
public: 
    void Accessor(); 

在FooAccess.cpp:

void FooAccess::Accessor() { 
    myFoo->[0]; // doesn't work 
    myFoo[0]; // doesn't work 
    pin_ptr<FooItem^> p = &myFoo[0]; // doesn't work 

我難倒。

請注意,我不允許編輯C#項目,並且C++/CLI類不能是ref class,因爲它繼承自本機類。

回答

3

gcroot模板使語法笨拙。你必須施展說服它吐出對象引用,((Foo ^)myFoo)[0]。啊。可讀的方式是解除對象引用了明確的模板:

void FooAccess::Accessor() { 
    Foo^ obj = myFoo; 
    FooItem^ value = obj[0]; 
    //... 
} 

但是你可以直接使用默認關鍵字寫:

FooItem^ value = myFoo->default[0]; 

一定要考慮封裝而不是繼承,在ref class中存儲專用的NativeCPPClass *,可幫助您避免gcroot的高成本和笨拙。