如何从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/