我需要使用VBA.Collection类,我需要注册一个COM组件才能做到这一点。我在我的电脑上找到了msvbvm60.dll文件并在我的系统中成功注册了该文件。我正在创建一个类VBA.Collection的实例,但我在该行代码中得到一个异常:
VBA.Collection collection = new VBA.Collection();
该例外有以下描述:
System.Runtime.InteropServices.COMException未处理
HResult = -2147221164 Message =正在检索COM类工厂 CLSID {A4C4671C-499F-101B-BB78-00AA00383CBB}的组件未通过 出现以下错误:80040154未注册类(例外情况除外) HRESULT:0x80040154(REGDB_E_CLASSNOTREG))。来源= mscorlib程序
错误码= -2147221164
我使用regedit.exe工具搜索CLSID为{A4C4671C-499F-101B-BB78-00AA00383CBB}的组件,但无法找到。我怀疑应该有另一个我应该注册的.dll文件,即使我可以在Visual Studio中使用对象浏览器看到引用msvbvm60.dll让我可以访问其中的VBA名称空间和Collection类。
它在这个网页http://codeverge.com/asp.net.migrating-from-asp/using-vba.collection-object-in-net/577432上说,如果我实例化VBA.CollectionClass,问题就会消失。但是,如果我这样做,我收到以下错误,我的代码没有编译:
Interop type' VBA.CollectionClass'无法嵌入。使用 适用的界面
我是否注册了错误的COM组件?或者我需要在C#代码中更改哪些内容?
我还在How to create VBA.Collection() object in c#上读到我需要基于VBA._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);
}
}
我现在用MyCollection collection = new MyCollection();
实例化MyCollection类
我不再有例外了。但是,我需要调用另一个返回类型为VBA.Collection的对象的COM组件的GetIncidentCodes()方法。如果我使用collection = class1.GetIncidentCodes();
,那么我的程序将无法编译,因为需要显式强制转换。如果我使用collection = (MyCollection) class1.GetIncidentCodes();
,则会出现以下异常:
无法转换类型为&#39; System .__ ComObject&#39;的COM对象。到班级类型 &#39; PoliceDispatcherClient.MyCollection&#39 ;.类型的实例 表示COM组件不能转换为不表示的类型 COM组件;但是只要它们可以转换为接口 底层COM组件支持对IID的QueryInterface调用 界面。
我应该将GetIncidentCodes()
的返回值转换为接口VBA._Collection
吗?我是.NET的新手,所以我不知道该怎么做。