ArcMap扩展ICustomInterface跨版本调用异常及方法调用问题求助
ArcMap扩展跨环境COM接口访问问题解决方案
一、接口访问失败的可能原因
- COM接口定义不规范:你怀疑的方向准确。如果
ICustomInterface未按COM标准定义(比如缺少GUID标识、未继承IUnknown接口),或未添加[ComVisible(true)]属性,低版本ArcGIS/Windows的COM运行时会更严格地拒绝识别这类非标准接口,而Win10+ArcGIS10.5的环境对这类接口兼容性更宽松。 - ArcGIS版本的COM宿主差异:ArcGIS 10.2到10.5之间,ArcObjects的COM宿主机制有更新,10.2的COM代理/存根验证逻辑更严苛,未正确注册的自定义接口无法被识别。
- Windows COM运行时版本差异:Windows 8和10的OLE32.dll(COM核心库)版本不同,Win10对COM接口的发现机制更灵活,Win8则要求接口必须在注册表中有完整的类型库注册信息。
二、让所有接口在系统层面可用的方法
- 重新注册类型库:如果能找到该扩展的
.tlb文件,在Win8+ArcGIS10.2环境下用32位的regtlibv12.exe(ArcGIS 10.x为32位程序)重新注册:regtlibv12.exe "C:\YourPath\SomeException.tlb" - 手动补全注册表项:若没有tlb文件,需在注册表中手动添加
ICustomInterface的相关项,路径为HKEY_CLASSES_ROOT\Interface\{ICustomInterface的GUID},需补充ProxyStubClsid32(指向标准或自定义代理存根的CLSID)和TypeLib项,确保COM运行时能识别接口定义。 - 生成.NET互操作程序集:用Visual Studio自带的
tlbimp.exe工具,将扩展的类型库导入生成.NET互操作程序集,在你的扩展中引用该程序集,通过强类型方式访问接口,强制.NET识别自定义接口。
三、带自定义类参数方法的调用解决
出现System.InvalidCastException是因为dynamic调用时,自定义类someClass的COM互操作类型未被正确识别,可通过以下方式解决:
- 确认自定义类的COM注册状态:
someClass必须是COM可见的,且在Win8环境下已完成注册。检查注册表中someClass的CLSID项是否存在,类型库是否已注册。 - 使用互操作程序集强类型调用:如果已生成该扩展的互操作程序集,将COM对象强制转换为
ICustomInterface后强类型调用方法:// 假设互操作程序集名为SomeExceptionInterop var customInstance = (SomeExceptionInterop.ICustomInterface)comExtensionObject; customInstance.SomeMethod_2(new SomeExceptionInterop.someClass()); - 手动包装托管对象为COM兼容类型:若无法获取互操作程序集,可使用
Marshal.CreateWrapperOfType将托管的someClass实例包装为COM可识别的对象:someClass myClassObj = new someClass(); var comCompatibleObj = Marshal.CreateWrapperOfType(myClassObj, typeof(someClass)) as someClass; dynamic customInterface = comExtensionObject; customInterface.SomeMethod_2(comCompatibleObj);
内容的提问来源于stack exchange,提问作者uvgen
相关产品推荐
相关产品推荐

