【发布时间】:2020-09-18 20:53:37
【问题描述】:
我无法让 Microsoft.Office.Interop.Outlook 库在 .NET Core 中按照我需要的方式工作,但它在 .NET Framework 中可以正常工作。因此,我想将我的主应用程序构建为一个 .NET Core 项目,并且只根据需要调用 .NET Framework 部分(来自同一解决方案中的另一个项目)。
所以我有了我的 .Net Framework 项目,我们称之为 TESTOutlookInterop。它有一个类看起来像这样:
using Microsoft.Office.Interop.Outlook;
namespace TESTOutlookInterop
{
public class OutlookInterop
{
public string GetSelectedMessage()
{
Application outlook = new Application();
OlSelectionLocation select = outlook.ActiveExplorer().Selection.Location;
string selection = outlook.ActiveExplorer().Selection[1].EntryID;
return selection;
}
}
}
如果我将下拉菜单设置在顶部并将其设置为 TESTOutlookInterop 并点击“开始”,这可以正常工作(当我从 TESTOutlookInterop 的 Main 方法调用 GetSelectedMessage() 时,它会返回我正在寻找的字符串,换句话说)。对于某些上下文,这基本上是查看当前 Outlook 进程并返回当前突出显示的任何消息的 ID。
现在我在这个解决方案中有第二个项目,称为 TESTcore。我尝试像这样调用 GetSelectedMessage() 方法:
using TESTOutlookInterop;
namespace TESTCore
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
OutlookInterop outlookinterop = new OutlookInterop();
ResultLabel.Content = outlookinterop.GetSelectedMessage();
}
}
}
如果我在 VS 中将下拉菜单设置为运行“TESTcore”并运行 Core 应用程序,则会调用“GetSelectedMessage()”方法,它的行为与我尝试在 .NET Core 中运行它时的行为相同(不完全可以工作,似乎是因为互操作库与 Core 不兼容)。那么如何从 Core 项目中正确调用 .NET Framework 项目中的这个互操作方法呢?
【问题讨论】:
-
这是不可能的。以 .NET 5 为目标,目前处于 RC 并计划于 11 月发布。它带来了对动态绑定器的支持。
-
您可以启动 .net 进程并通过 stdin / stdout 传递 json 消息...我曾经使用类似的方法从 64 位 .net 进程代理到与 32 位办公室互操作。
-
重复显示是的,这是可能的,只要您使用
Add COM Reference。 Hans Passant 很久以前可能发布的一个答案解释说,Office 互操作库本质上是旧 .NET 旧版本中不完整的 COM 支持的解决方法。在 .NET 1.x 中,没有可选参数,没有dynamic类型,因此 Visual Studio 生成的 COM 代理......有点难以使用。您应该可以通过使用Add COM Reference直接使用任何 Office 应用程序
标签: c# visual-studio .net-core