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