2014-07-23 144 views
2

我有一个C#dll(为其设置COM互操作选项的注册表)。将托管C#列表返回到非托管C++代码

这个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

COM知道关于.NET泛型的bean。改为返回一个ArrayList或非泛型IEnumerator或您自己的集合接口。 –

回答

0

'通用代码不能导出到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

+0

可以请你帮助我如何从非托管C++ –

+0

访问字符串[],不确定是否存在这个问题,_IF_可以更改MyClass和IMyInterface,然后我建议一个选项是添加上述方法,从哪里调用它作为你调用IsNameExists – tolanj

+0

我可以在C#中添加上面的方法GetNameArray()。我想知道如何从C++中取回字符串[]。 –