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

标签 c# .net dll c++-cli mixed-mode

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

最佳答案

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

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

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

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

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

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

相关文章:

c# - 测试 WCF URL 的可用性

c# - 在类里面使用相同类型的列表是一个好的做法吗?

.net - 何时使用集合与多个属性

c# - Visual Studio 2017 Asp.Net Core 项目不会在构建时复制依赖的 dll 文件

javascript - AngularJS 输入选择 ng-model 中的整数值停止工作

c# - Nhibernate CommitAsync 是否等待所有异步 CRUD 操作?

c# - C# (.NET) 中的 Android AsyncTask 类似功能

.net - 什么是 res ://*/in . 网络?

c# - 我应该为模块化创建 DLL 吗?

通过 nvidia quadro 600 gpu 模式访问时 C# DOT NET 应用程序崩溃 - nvd3dum.dll 崩溃