我有一个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 ++代码可以使用此列表。
答案 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