我需要从C#代码中创建Interop VBA.Collection对象 我在我的项目中引用了Interop.VBA
当我打电话给他时:
var col = new VBA.Collection()
在运行时我遇到一个错误,说dll没有注册...
我发现:http://support.microsoft.com/kb/323737/en-us
它可能有效,但我的盒子上没有VB6编译器 我想知道你知道其他的解决方法(或者有人可以编译这个ActiveX给我?)
答案 0 :(得分:4)
我没试过这个,但它可能有用。
为VB6的VBA6.dll创建导入库。创建自己的_Collection接口实现。使用此实现代替VBA.Collection类。
class MyCollection : VBA._Collection
{
private Dictionary<object, object> _items = new Dictionary<object, object>();
public void Add(ref object Item, [System.Runtime.InteropServices.OptionalAttribute]ref object Key, [System.Runtime.InteropServices.OptionalAttribute]ref object Before, [System.Runtime.InteropServices.OptionalAttribute]ref object After)
{
// Ignoring the Before and After params for simplicity
_items.Add(Key, Item);
}
public int Count()
{
return _items.Count;
}
public System.Collections.IEnumerator GetEnumerator()
{
return _items.Values.GetEnumerator();
}
public dynamic Item(ref object Index)
{
return _items[Index];
}
public void Remove(ref object Index)
{
_items.Remove(Index);
}
}
答案 1 :(得分:0)
我已经为vb.net改编了这个,并且必须修复添加的密钥,因为它在丢失时为空。
我测试后会编辑这篇文章。我需要确保它在VB6调用.Net dll时工作,将vba集合作为参数传递给它,然后.Net dll将另一个vba集合作为返回值传递回去。男人,如果它有效,这将为我省下这么多麻烦!
Public Class VBACollection
Implements VBA._Collection
Private _items As New Dictionary(Of Object, Object)
Public Sub Add(ByRef Item As Object, Optional ByRef Key As Object = Nothing, Optional ByRef Before As Object = Nothing, Optional ByRef After As Object = Nothing) Implements VBA._Collection.Add
' Ignoring the Before and After params for simplicity
Key = If(Key, Item)
_items.Add(Key, Item)
End Sub
Public Function Count() As Integer Implements VBA._Collection.Count
Return _items.Count
End Function
Public Function GetEnumerator() As System.Collections.IEnumerator Implements VBA._Collection.GetEnumerator, System.Collections.IEnumerable.GetEnumerator
Return _items.Values.GetEnumerator()
End Function
Public Function Item(ByRef Index As Object) As Object Implements VBA._Collection.Item
Return _items(Index)
End Function
Public Sub Remove(ByRef Index As Object) Implements VBA._Collection.Remove
_items.Remove(Index)
End Sub
End Class
修改强>
不,这不适用于VB6。 VB6说:
&#34; Class不支持自动化或不支持预期 接口&#34;
这里讨论的类是我的类,它使用VBACollection而不是VBA.Collection。 VBACollection与VBA.Collection不是一个相同的替身。我想找出原因并尝试假装COM接受它。