AxDrawingControl
在我的应用程序中使用dll AxInterop.Microsoft.Office.Interop.VisOcx.dll
(v4.0.30319)时出现以下异常:
System.Runtime.InteropServices.COMException occurred
HResult=-2147221164
Message=Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Source=System.Windows.Forms
ErrorCode=-2147221164
The stackTrace:
at System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
at System.Windows.Forms.AxHost.CreateWithoutLicense(Guid clsid)
at System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
at System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
at System.Windows.Forms.AxHost.CreateInstance()
at System.Windows.Forms.AxHost.GetOcxCreate()
at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
at System.Windows.Forms.AxHost.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.AxHost.EndInit()
at TestVisOcxAxDrawing.VisioTestForm.InitializeComponent() in C:\ TestVisio\TestVisOcxAxDrawing\VisioTestForm.Designer.cs:line 55
InnerException:
- 应用程序在配置管理器中配置为“Any CPU” -> “Active Solution Platform”</li>
- 该应用程序在 Windows8 64 位操作系统中作为 64 位应用程序执行时会引发上述错误。
Visio 安装的是Professional 2010,x86 版本。
以下是我迄今为止的观察:
- 安装 visio x64 版本时,visio 绘图控件加载正常。
- 如果将“Active Solution Platform”更改为 x86 版本,它也可以正常工作。
不幸的是,在我的情况下,上述两种解决方法都是不可能的,因为它是一次单击应用程序,并且客户端可以在安装了任何 Visio 版本的任何版本的 Windows 上运行。
问题:
- 应用程序是否可以配置为“任何 CPU”并且仍然支持 visio 32 和 64 位版本?
是否有任何替代方案/最佳实践来处理这种情况?
- 例如:分别发布 32 和 64 版本的应用程序?
- 或者是否可以将 64 位和 32 位版本的 Visio dll 与应用程序一起提供,并在发生错误时在它们之间切换?
重建步骤
- 在 64 位 Windows 操作系统的机器上,在 VS2010 中新建一个 Windows 窗体项目。
Any CPU
像在 Configuration Manager -> 中一样配置项目Active Solution Platform
。- 右键单击工具箱并单击
Choose Items
-> 导航到COM Components
选项卡 -> 检查Microsoft Office Visio 14.0 Drawing Control
。 - Visio 绘图控件现在将出现在工具箱上。
- 将
Microsoft Office Visio 14.0 Drawing Control
控件拖到窗体中,然后按F5
。 - 错误会
Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
抛出。
谢谢, 问候, 普拉文