【问题标题】:Returning Managed C# List to Unmanaged C++ code将托管 C# 列表返回到非托管 C++ 代码
【发布时间】:2014-09-14 13:41:48
【问题描述】:

我有一个 C# dll(为它设置了 COM 互操作选项的寄存器)。

此 C# dll 具有以下接口和类

interface IMyInterface
{
    bool IsNameExists(string name);
    List<string> GetNameList();
} 

public class MyClass : IMyInterface
{

    public bool IsNameExists(string name)
    {
        //DO Something

    }
    public List<string> GetNameList()
    {

        // DO something
    }

} 

我需要从非托管 C++ 中调用 IsNameExists 和 GetNameList 方法。

#import "..\..\ProdCon\bin\ProdCon.tlb" raw_interfaces_only

   void main()
   {    
        HRESULT hr =::CoInitialize(NULL);
        IMyInterface pIMyInterface(__uuidof(MyClass));

        VARIANT_BOOL bRet = FALSE;

        BSTR bstrName = ::SysAllocString(_T("RAJESH"));
        hr =  pIMyInterface->IsNameExists(bstrName,&bRet);

    }

所以我像上面一样创建了 COM 对象并调用 IsNameExists 方法没有任何问题。

由于 GetNameList 方法返回列表,我收到以下警告

'MyDll.IMyInterface.GetNameList(#0),MyDll'。警告:类型库 导出器在签名中遇到泛型类型实例。通用的 代码可能无法导出到 COM。

请帮助我如何将 C# 列表返回到非托管 C++ 代码。这样非托管 C++ 代码就可以使用这个列表。

【问题讨论】:

  • COM 了解 .NET 泛型。返回一个 ArrayList 或非泛型 IEnumerator 或您自己的集合接口。

标签: c# list unmanaged managed


【解决方案1】:

'通用代码不能导出到 COM。' => 因此它是 public List GetNameList() 中的类型参数字符串。因此,基本上您需要访问非泛型 c# 方法来获取数据。

如果您可以控制 MyClass 代码库,您可以(例如)添加:

public string[] GetNameArray()
{
   return GetNameList.ToArray();
}

如果没有,那么您将需要编写一个代理/包装类来执行与上述类似的操作,并通过 COM 公开它,无论是作为一次性方法还是使用反射的“通用”方法。

例如见http://weblog.west-wind.com/posts/2007/Jul/10/Generics-and-COM-Interop-dont-mix

【讨论】:

  • 你能帮我如何从非托管 C++ 访问 string[]
  • 不确定这个问题,IF 你可以更改 MyClass 和 IMyInterface 然后我建议一个选项是添加上述方法,当你调用 IsNameExists 时调用它
  • 我可以在C#中添加上面的方法GetNameArray()。我想知道如何从 C++ 中检索 string[]。
猜你喜欢
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多