C# 将.net字典或列表转换为VBA';s的等效字典或集合
我必须将.net字典或列表类型的对象传递给VBA。 但当我在VBA端传递.net字典时,我无法看到.net端字典的元素 我的C代码# 在VBA端,我的宏是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对象是不同的。 那么,是否有任
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];
}
}