【发布时间】:2018-05-25 03:55:14
【问题描述】:
我遇到了一段非常简单的 C# .NET 代码问题,它应该(现在)简单地检索运行 WinForms 应用程序的计算机上安装的 Office 的版本号:
var oApp = new Outlook.ApplicationClass();
var outlookVersionString = oApp.Version;
它正确地实例化对象,但是当我尝试访问 Version 属性时,我得到以下信息:
{"Unable to cast COM object of type 'Microsoft.Office.Interop.Outlook.ApplicationClass' to interface type 'Microsoft.Office.Interop.Outlook._Application'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00063001-0000-0000-C000-000000000046}' failed due to the following error: Interface not registered (Exception from HRESULT: 0x80040155)."}
我在网上做了很多搜索,所以简要介绍一下我的尝试:
- 检查
[HKEY_CLASSES_ROOT\TypeLib\{00062FFF-0000-0000-C000-000000000046}]中是否仅存在一个密钥 (9.6) - 检查此 ClassID 和版本是否匹配
[HKEY_CLASSES_ROOT\Interface\{00063001-0000-0000-C000-000000000046}] - 向
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regtlibv12.exe "C:\Program Files (x86)\Microsoft Office\root\Office16\MSOUTL.OLB"注册 MSOUTL.OLB(失败,因为 VS2017 未附带 regtlibv12.exe) - 正在下载 regtlibv12.exe 并重试(失败,因为“此应用无法在您的 PC 上运行”)。
- 运行
C:\Users\uczms>c:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /TLB "C:\Program Files (x86)\Microsoft Office\root\Office16\MSOUTL.OLB"(失败,因为它is not a valid .NET Assembly) - 运行
C:\Users\uczms>c:\Windows\Microsoft.NET\Framework64\v2.0.50727\regasm.exe /TLB "C:\Program Files (x86)\Microsoft Office\root\Office16\MSOUTL.OLB"(失败,因为它is not a valid .NET Assembly) - 使用适用于旧 Interop 库的内容(编辑:注意,这似乎不适用于我们的 Office 2016 桌面),这是一个微妙的变化:
var oApp = new Outlook.Application();
var outlookVersionString = oApp.Version;
值得注意的是,我有一个干净的 Windows 10 Enterprise N Creators Update 和 Office 2016 / 365 ProPlus,没有安装任何以前的版本,也没有降级。
我通常不是桌面应用程序开发人员,所以虽然我掌握了其中一些库注册工具,但我绝不是专家。..
【问题讨论】:
-
您使用了错误的项目,请尝试:var oApp = new Outlook.Application();
-
@Rob,见上面的第 7 点(现在编辑以添加代码格式)
-
我在 2016 年,使用 Outlook.Application() 对我有用。
-
好奇,开发机是2016年的吗?尝试删除引用并重新添加(最新) - 它可能试图保留旧的引用。
-
叹息,谁知道为什么会发生这些事情。只要赢了就不用担心了:-)