【问题标题】:C# Mixing .NET Core and .NET Framework projects in one solution [duplicate]C#在一个解决方案中混合.NET Core和.NET Framework项目[重复]
【发布时间】: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


【解决方案1】:

您可以尝试以下代码在 .net 核心应用中使用 Outlook 互操作。

首先,请创建一个 .net core 应用(我使用的是控制台应用)。

其次,右击Dependencies->选择Add COM Reference。

第三,请在选项卡中添加 Microsoft Outlook 16.0 对象库。

第四,请将“Embed Interop Types”设置为“Yes”。

终于可以在.net core app中使用相关代码了。

using Microsoft.Office.Interop.Outlook;

 static void Main(string[] args)
        {
            Application outlook = new Application();
            MailItem selection = outlook.ActiveExplorer().Selection[1];
            Console.WriteLine(selection.EntryID);
            Console.WriteLine(selection.Subject);
        }

【讨论】:

  • 请先试试我的解决方案。我使用.net core 3.1。来自Outlook Interop in .NET Core 3.0?
  • 在这种情况下,您应该将其作为副本关闭,而不是发布您自己的答案没有归属,忘记提及最重要的部分 -该库应作为 COM 引用添加。 SO 与 Technet 论坛有非常不同的规则。一个答案必须是完整的,而不仅仅是一组没有解释的步骤。当重复已经存在时,回答绝对不是一个好主意。它会增加噪音并使人们更难解决他们的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2018-12-18
  • 2022-07-14
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
相关资源
最近更新 更多