Вызов перегруженного доступа к массиву C# из неуправляемого C++/CLI

У меня есть проект С#, который переопределил доступ к массиву ([]) следующим образом:

Foo.cs:

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

Проект скомпилирован в .dll, на который ссылается мой проект C++/CLI.

У меня есть неуправляемый класс С++/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, поскольку он наследуется от собственного класса.


person John Lien    schedule 09.09.2015    source источник


Ответы (1)


Шаблон gcroot делает синтаксис неуклюжим. Вы должны выполнить кастинг, чтобы убедить его выдать ссылку на объект, ((Foo^)myFoo)[0]. Фу. Читаемый способ — явно вывести ссылку на объект из шаблона:

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

Но вы можете написать его напрямую, используя ключевое слово default:

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

Рассмотрите возможность инкапсуляции вместо наследования, хранение частного NativeCPPClass* в ref class поможет вам избежать высокой стоимости и неуклюжести gcroot.

person Hans Passant    schedule 09.09.2015