gpt4 book ai didi

c# - 从非托管 C++/CLI 调用重载的 C# 数组访问

转载 作者:行者123 更新时间:2023-11-30 21:55:14 24 4
gpt4 key购买 nike

我有一个 C# 项目,它覆盖了数组访问 ([]),如下所示:

Foo.cs:

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

该项目被编译成一个 .dll,它被我的 C++/CLI 项目引用。

我有一个非托管 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,因为它继承自 native 类。

最佳答案

gcroot 模板使语法变得笨拙。你必须进行转换才能说服它吐出对象引用 ((Foo^)myFoo)[0]。啊。可读的方式是将对象引用显式地从模板中提取出来:

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

但是你可以直接使用default关键字来写:

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

请考虑封装而不是继承,将私有(private)的 NativeCPPClass* 存储在 ref class 中,帮助您避免 gcroot 的高成本和尴尬。

关于c# - 从非托管 C++/CLI 调用重载的 C# 数组访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32470764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com