【发布时间】:2015-05-29 08:46:03
【问题描述】:
"如果你想使用Interop,那么组件应该安装在 系统。否则,将无法正常工作。”
我有一个 WinForm 应用程序,许多用户在几个 SO(WinXP、Win7、Win8.1、WinServer 2008、WinServer 2012)中使用它
在开发中,我使用了一个 COM 组件(Outlook、SpeechLib、...)。
两个键:
- 某些用户无法安装该组件。或者他们没有安装它。
- 其他用户可以安装该组件。
任何编程方式:
- 避免未安装组件的用户应用失败
- 该应用程序适用于已安装该组件的用户
?
注意事项:
以编程方式确定特定 COM 库 DLL 是否已安装或已安装。无论如何,如果没有安装特定的 COM 库,目标是我的源代码在没有安装该 COM 的机器上运行时不会失败。
例如,用于Excel、Word、Outlook COM (ActiveX)、SpeechLib(Microsoft 语音对象库)等
我可以有这样的源代码:
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpeechLib.ISpeechVoice speech = new SpeechLib.SpVoiceClass();
// ....
或者无论如何使用 Outool 应用程序类,或 Excel.Application 等。
Type officeType = Type.GetTypeFromProgID("Excel.Application");
if (officeType == null)
{
// Excel is not installed.
// Show message or alert that Excel is not installed.
}
else
{
// Excel is installed.
// Continue your work.
}
我的老问题,但不是解决方案:
检测安装的 Outlook 并动态加载 INterop.Outlook Detect Outlook installed and load dynamically INterop.Outlook
我在 VS2010 中有一个 Windows 窗体应用程序。它有一个参考 互操作性展望 (2003)。然后,我重新安装了 Windows XP 并 VS2010,但不安装 Outlook。
现在,项目无法编译。
我认为,如果未安装 Outlook,我的应用程序将无法运行 我的程序在其上执行的机器。
我需要知道我是否检测到 Outlook 已安装并动态加载 Interop.Outlook.dll(用于使用 Outlook PIA 或 Embedded Interop .NET 4) 中的类型。
如果机器有 Outlook (2003, 2007, 2010, 可能需要代码来 检测版本并执行 Outlook 版本的兼容性)安装, 该应用程序可以在功能上与 Outlook 配合使用。
如果机器没有安装 Outlook,(在运行时)应用程序 没有功能 Outlook 也可以正常工作。我想,如果机器 尚未安装 Outlook,(在运行时)应用程序失败,因为 对 Outlook.Application 类的引用(在源代码中)?
在开发机器中,应用程序可以正常工作,因为 Outlook(和 COM) 已安装在机器中。
有没有关于它的示例源代码或 goog 模式和实践?
参考文献
如果机器中未安装 Office,此代码是否会失败? How to detect installed version of MS-Office?
http://www.codeproject.com/Tips/679027/How-to-Check-Whether-Excel-is-Installed-in-the-Sys?msg=5027820#xx5027820xx How to check, programatically, if MS Excel exists on a pc?
http://codeblog.jonskeet.uk/2009/07/07/faking-com-to-fool-the-c-compiler
【问题讨论】:
-
问题在哪里?看来您已经使用 Type.GetTypeFromProgID 方法找到了解决方案。
-
@EugeneAstafiev "如果你想使用Microsoft.Office.Interop.Outlook,那么组件应该安装在系统中。否则,它将无法工作。" 我使用此代码编译我的程序集
olkApp1 = new Microsoft.Office.Interop.Outlook.Application(); olkMail1 = (MailItem)olkApp1.CreateItem(OlItemType.olMailItem);加载程序集时,如果未安装 COM,则不会失败?
标签: c# com interop office-interop text-to-speech