如何从c#方法中返回列表,并在c ++中使用列表返回值,您可以指导如何操作吗?
我想按照以下方式完成我的完整方案:

在c#DemoLib.cs中

usng System;using System.Collections.Generic;

public interface IDiscover
{
  void GetList1();
  String GetList2();
  List<string> GetList3();
};

namespace DemoLibrary

{

  class DemoLib
 {
   public void GetList1()
   {

    Console.WriteLine(" I am from Void GetList()");

   }
   public string GetList2()
   {

    Console.WriteLine(" I am from string GetList()");

    return "Stack OverFlow";

   }

   public List<string> GetList3()
   {

    List<string> li=new List<string>();

    li.Add("India");
    li.Add("America");
    li.Add("London");

     Console.WriteLine(" I am from List<string> GetList()");

    return li;
   }


生成成功并创建了DemoLib.dll

我将DemoLib.dll复制到c:\ DemoLib.dll,并使用regasm在c:\中创建了Demolib.tlb

现在在Vc ++中,我Hav main()

DemoLibMain.vc ++

#include<list>

#include<stdio.h>

void main()
{

   HRESULT Hr=CoInitialize(NULL);

  IDiscoverPtr Iptr(__uuidof(DemoLib));

   Iptr->GetList1();

  std::string str=Iptr->GetList2();

  printf("%s",str); //dispalys "null" insted of "stack overflow" but when i debugging it

                     shows the value "stack overflow" at str.


Iptr->(害怕,因为它不给GetList3())

当我强制编写Iptr-> GetList3()时,将错误显示为


  GetList3不是IDiscover的成员。

最佳答案

我是使用C#的对象类型完成的

C#导出为COM

public void GetList(ref object list)
{
  String[] dummy = { "1" };
  Array.Resize(ref dummy, 3);
  list = dummy;
}


本机C ++

_variant_t list;
GetList(list);
const VARTYPE type (static_cast<VARTYPE>(list.vt & VT_TYPEMASK));
const bool isArray (0 != (list.vt & VT_ARRAY));
const bool isVector(0 != (list.vt & VT_VECTOR));
if(isArray) {
  SAFEARRAY* buffer = src.parray;
  ...
}


这里的问题是vbscript无法访问SAFEARRAY。但这对于大多数其他语言来说没有问题。

关于c# - 如何从C#返回列表并通过com在vc++中使用它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1036720/

10-10 19:31