【问题标题】:How to return collection objects from c# and Access them in c++?如何从 c# 返回集合对象并在 c++ 中访问它们?
【发布时间】:2010-11-06 11:11:18
【问题描述】:

我尝试从 c# 返回一个对象集合并通过 COM 使用 c++ 访问它们但失败了。我尝试了 List ArrayList 和 IDictionary all 但失败了。

我试过了

How to return a collection of strings from C# to C++ via COM interop 也成功了。

任何人都可以帮助我

【问题讨论】:

标签: c# c++ com


【解决方案1】:

@Partial,你提出了一个重要的观点。您不能将 .NET“对象”传递回 C++(除非它是托管 C++),因为 .NET 对象语义与 C++ 对象语义不同。

@Cute:但是,您可以传递 COM 接口指针。如果您需要“传统 C++”代码与 .NET 对象通信,请使用 COM 接口,而不是对象。

确保您的对象被标记为 COM 对象,并且您实现了一个合适的接口,其中包含您的 C++ 所需的方法。然后,将接口引用数组传递回 C++ 代码。 C++ 代码应该获得一个 COM 接口指针的 SafeArray,它可以使用通常的 COM 语义(AddRef() 等)对其进行操作。

【讨论】:

  • 你给我一些代码来了解一下。我已经使用 IDictionary 也是一个通用接口,但在 c++ 中获取值
【解决方案2】:

使用老式数组怎么样?

public interface IManaged
{
    string[] ReturnArray();
}

public class Managed : IManaged
{
    public string[] ReturnArray()
    {
        return new string[] { "A", "B", "C" };
    }
}

使用此 .dll 运行 tlbexp.exe 会创建一个带有以下内容的 .tlb:

interface IManaged : IDispatch {
    [id(0x60020000)]
    HRESULT ReturnArray([out, retval] SAFEARRAY(BSTR)* pRetVal);
};

我还没有使用原生 .exe 中的 .dll 进行测试,但它看起来很有希望 :)

【讨论】:

    【解决方案3】:

    不能将对象从 c# 传递到 c++ 或从 c++ 传递到 c# 是正常的。 c# 中的对象与 c++ 中的对象不同。您可以从 c# 传递到 c++ 的是 bool、int 和 char 等类型。另外,请注意类型的大小...例如,c# 中的 char 是 c++ 中的 wchar_t。

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2014-12-31
      • 2013-08-15
      相关资源
      最近更新 更多