将托管C#列表返回到非托管C ++代码

时间:2014-07-23 11:32:37

标签: c# list unmanaged managed

我有一个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 mehtod。

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

  

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

请帮助我如何将C#列表返回到非托管C ++代码。因此,非托管C ++代码可以使用此列表。

1 个答案:

答案 0 :(得分:1)

&#39;通用代码可能无法导出到COM。&#39; =&GT;因此它是公共List GetNameList()中的类型参数字符串。因此,基本上您需要访问非通用的c#方法来获取数据。

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

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

如果没有,那么你需要编写一个代理/包装类来做类似于上面的事情,然后通过COM公开它,作为一个或一般的&#39;使用反思的方法论说。

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