[英]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.