我将从外部应用程序开始一个新的Outlook交互项目(邮件主题处理,清除Re: Fw:等主题)。在外部DB中添加主题标记、研究主题标记等)。我习惯于调用Marshall.GetActiveObject()
方法来控制已经在运行的Outlook Application
。
随着.NET 5.0的发布,我发现Marshall.GetActiveObject()
方法不再可用。
有别的办法吗?我希望使用.NET 5.0而不是.NET Framework,以避免.NET框架降级的任何进一步问题。
提前谢了,伙计们。
发布于 2020-11-23 17:13:12
Outlook是一个单例--始终只有一个outlook.exe实例在运行。绝对没有理由使用Marshall.GetActiveObject()
--始终使用new
运算符创建Outlook.Application
对象的新实例。
发布于 2021-12-26 00:44:50
如果有帮助的话,我也在同一条船上--尝试将Outlook代码移植到Net5,但不使用GetActiveObject("Outlook.Application") as Outlook.Application;
来获得对正在运行的Outlook应用程序的引用。我的NETFramework4.8代码在几年内运行良好,因此当然可以使用GetActiveObject来完成这项工作。
但是有了Net5,我很难找到一种方法来引用Office应用程序。我在下面显示了与Outlook一起工作的代码(尽管我认为它不应该)。
NET 4.8 (works)
var o = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
NET 5.0 (works)
var o = Marshal.BindToMoniker("Outlook.Application") as Outlook.Application;
我不知道为什么BindToMoniker工作-我认为这需要一个路径名作为一个论点。无论如何,它在Windows11 NET5.0上工作,项目TargetFramework和Interop.Outlook参考如下所示。
<PropertyGroup>
<TargetFramework>net5.0-windows</TargetFramework>
</PropertyGroup>
<ItemGroup>
<COMReference Include="Microsoft.Office.Interop.Outlook">
我仍然困在如何获得运行Excel,Access,Word等Office应用程序的参考。
UPDATE为我提供了一个指向解决方案的链接,该解决方案是创建我自己的MarshalGet2.ActiveObject接口,如本文所示:
https://stackoverflow.com/questions/64965895
复制相似问题