从非托管 C++/CLI 调用重载的 C# 数组访问
Calling overloaded C# array access from unmanaged C++/CLI
我有一个 C# 项目,它覆盖了数组访问 ([]),如下所示:
Foo.cs:
public override FooItem this[long index] {
...
该项目被编译成我的 C++/CLI 项目引用的 .dll。
我有一个非托管 C++/CLI class,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 class 不能是 ref class
,因为它继承自本机 class。
gcroot 模板使语法变得笨拙。你必须进行转换才能说服它吐出对象引用 ((Foo^)myFoo)[0]。啊。可读的方式是显式地将对象引用从模板中提取出来:
void FooAccess::Accessor() {
Foo^ obj = myFoo;
FooItem^ value = obj[0];
//...
}
但是可以直接用default关键字写:
FooItem^ value = myFoo->default[0];
考虑封装而不是继承,将私有的 NativeCPPClass* 存储在 ref class
中,帮助您避免 gcroot 的高成本和笨拙。
我有一个 C# 项目,它覆盖了数组访问 ([]),如下所示:
Foo.cs:
public override FooItem this[long index] {
...
该项目被编译成我的 C++/CLI 项目引用的 .dll。
我有一个非托管 C++/CLI class,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 class 不能是 ref class
,因为它继承自本机 class。
gcroot 模板使语法变得笨拙。你必须进行转换才能说服它吐出对象引用 ((Foo^)myFoo)[0]。啊。可读的方式是显式地将对象引用从模板中提取出来:
void FooAccess::Accessor() {
Foo^ obj = myFoo;
FooItem^ value = obj[0];
//...
}
但是可以直接用default关键字写:
FooItem^ value = myFoo->default[0];
考虑封装而不是继承,将私有的 NativeCPPClass* 存储在 ref class
中,帮助您避免 gcroot 的高成本和笨拙。