繁体   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