簡體   English   中英

將托管C#列表返回到非托管C ++代碼

[英]Returning Managed C# List to Unmanaged C++ code

我有一個C#dll(設置了COM interop選項的寄存器)。

這個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 ++代碼可以使用此列表。

'通用代碼可能無法導出到COM。' =>因此它是公共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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM