2014-07-23 82 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++中取回字符串[]。 –