C# 将.net字典或列表转换为VBA';s的等效字典或集合

C# 将.net字典或列表转换为VBA';s的等效字典或集合,c#,vba,excel,vsto,c#-to-vb.net,C#,Vba,Excel,Vsto,C# To Vb.net,我必须将.net字典或列表类型的对象传递给VBA。 但当我在VBA端传递.net字典时,我无法看到.net端字典的元素 我的C代码# 在VBA端,我的宏是 public Sub MyVBAMacro(var as variant) end Sub 我也试过了 public Sub MyVBAMacro(var as Scripting.Dictionary) end Sub 但对我不起作用 在VBA的监视窗口中,我没有得到字典元素 所以我认为.net和VBA对象是不同的。 那么,是否有任

我必须将.net字典或列表类型的对象传递给VBA。 但当我在VBA端传递.net字典时,我无法看到.net端字典的元素

我的C代码#

在VBA端,我的宏是

public Sub MyVBAMacro(var as variant)

end Sub
我也试过了

public Sub MyVBAMacro(var as Scripting.Dictionary)

end Sub
但对我不起作用

在VBA的监视窗口中,我没有得到字典元素

所以我认为.net和VBA对象是不同的。 那么,是否有任何解析类可用于将.net对象转换为等效的VBA对象

问题也与.net列表对象有关。 .net数组工作正常,但我想将字典或集合类型的对象传递给VBA

请让我知道是否有一些解决办法

谢谢,
Monil Gangar

在VBA和.NET之间进行互操作时,需要使用COM 这是一个简单的开始:

但是它可以很快变得更复杂一些,我建议在执行这样的任务时,阅读通用COM、封送处理、引用计数和类型库等主题

使字典COM可见的简单示例

[ComVisible(true)]
public interface IDictWrapper
{
    object GetByKey(string key);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IDictWrapper))]
public class DictWrapper: Dictionary<string,object>, IDictWrapper
{
    public object GetByKey(string key)
    {
        return base[key];
    }
}
[ComVisible(true)]
公共接口IDictWrapper
{
对象GetByKey(字符串键);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IDictWrapper))]
公共类DictWrapper:Dictionary,idictwapper
{
公共对象GetByKey(字符串键)
{
返回基[键];
}
}

Hii,我已经创建了您上面提到的comVisible接口和类。问题是,当我将.net数组数据结构传递给VBA时,我能够在VBA端获得它。但我无法在VBA端获取.net字典类型的数据结构。在这种情况下你能帮我吗?默认情况下数组会被封送。当你这样做的时候,会有很多事情发生在幕后,仅仅按原样使用它可能会有点危险。那么有没有解析器可以将.net对象转换为COM或VBA类型的对象呢?我现在在.net端添加了一个脚本.Dictionary的dll,我正在向该VBA字典添加数据,并将该字典传递给VBA端及其工作,但由于我的数据是.net Dictionary到VBA Dictionary的转换,需要花费大量的时间。您将需要实现一个类似于我的COM可访问接口张贴。我只能重复一遍,疯狂地来回传递类型,直到它神奇地工作为止,这将导致COM出现非常糟糕的情况。除非您确切知道自己在做什么,否则请控制。好的,但是我如何将我的.net字典转换为VBA字典。我有一个字符串形式的json结构,我正在JavaScriptSerializer类的帮助下反序列化它。所以它创建了一些由字典和列表组成的嵌套对象。所以现在我想把这个嵌套结构传递给VBA。那么我将如何实现它呢?嗨,Monil,会有帮助吗?
public Sub MyVBAMacro(var as Scripting.Dictionary)

end Sub
[ComVisible(true)]
public interface IDictWrapper
{
    object GetByKey(string key);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IDictWrapper))]
public class DictWrapper: Dictionary<string,object>, IDictWrapper
{
    public object GetByKey(string key)
    {
        return base[key];
    }
}