将托管c#列表返回给非托管c++代码



我有一个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 "....ProdConbinProdCon.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++代码。

'通用代码不能导出到COM。' =>因此它是公共列表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

相关内容

  • 没有找到相关文章

最新更新