将 COM 对象添加到 Asp Net Core

Posted

技术标签:

【中文标题】将 COM 对象添加到 Asp Net Core【英文标题】:Adding COM Objects to Asp Net Core 【发布时间】:2018-04-02 15:05:33 【问题描述】:

我有一个使用Interop.ADODB 的单元测试项目。代码如下:

public CDO.Message ReadMessage(string emlFileName)

    if (string.IsNullOrEmpty(emlFileName)) return null;
    CDO.Message msg = new CDO.MessageClass();
    ADODB.Stream stream = new ADODB.StreamClass();
    stream.Open(Type.Missing,
        ADODB.ConnectModeEnum.adModeUnknown,
        ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, string.Empty, string.Empty);
    stream.LoadFromFile(emlFileName);
    stream.Flush();
    msg.DataSource.OpenObject(stream, "_Stream");
    msg.DataSource.Save();
    return msg;

问题是我将此项目转换为 .NET Core。我无法弄清楚如何导入使此方法有效所需的 COM 库。我需要的是Interop.ADODBInterop.CDO

此方法所做的只是获取一个电子邮件文件并转换为对象,以便我可以从中读取值,然后与发送的电子邮件进行比较。真正用于验证电子邮件内容的简单单元测试。

有没有办法让我导入 COM 对象,或者是否有一个库可以替换我现在应该使用的 CDO.Message

【问题讨论】:

如果您使用的是 VS2017,则可以选择通过“添加引用”添加 COM 库 @Niladri 我正在寻找类似的东西,但我没有看到。我正在使用 VS2017 社区。 “添加参考”下列出的唯一内容是项目和共享项目。这就是我在旧的 MVC5 项目中使用它的方式。现在这是一个核心项目,看起来很不一样。 一般来说,“DotNet Core”框架的要点之一是支持编写可移植的应用程序,您以后也可以在 Azure/Docker/Linux/等上托管这些应用程序。使用 COM API 可以防止这种情况发生,因为根据定义您需要 Windows,并且通常还需要安装一些特殊的本地组件,这会阻止云托管等。如果我用谷歌搜索它,emlFiles 看起来像电子邮件,CDO.Message 表示 Exchange 服务器?您确定这组 API 仍然可以使用吗?我搜索了一下,我认为 Exchange 提供了 REST API,我认为从长远来看它对您来说更方便。 如果您不需要可移植性/多平台托管,为什么还要使用 aspnetcore?在正常的 aspnet 上执行此操作。如果我清楚地记得路线图,两者都将得到长期支持,因此在不需要时将自己限制在 Core 上似乎是不明智的。 对你来说是个坏消息和好消息weblogs.foxite.com/joel_leach/2016/10/19/… 【参考方案1】:

不建议从 .NET Core 访问 COM 对象,因为 .NET Core 应用程序设计为独立于平台,而诸如 ADODB.StreamCDO.Message 之类的 COM 对象是特定于 Windows 的。

但是,这确实是可能的 - 如果您不介意后期绑定和弱类型。

dynamic msg = Activator.CreateInstance(Type.GetTypeFromProgID("CDO.Message", true));

...

dynamic stream = Activator.CreateInstance(Type.GetTypeFromProgID("ADODB.Stream", true));

等等

在 Windows 上运行时,这适用于 .NET Core 2.0。显然,according to this article,以前的版本是不可能的。

不过,最好使用托管平台无关代码重写您的方法。

【讨论】:

你知道 Core 支持哪些库,它会读取 eml 文件并将其作为对象返回吗? 我刚刚读到Type.GetTypeFromProgID 在 1.0 和 1.1 上不起作用,要么它丢失了,要么抛出了不受支持的平台 - 但我只是读过它,没有尝试过自己。无论如何,以防万一 Bojan 跳过我对这个问题的评论,我坚信 Exchange 公开了可以做同样事情的新的非 COM API。如果可能的话,值得检查和放弃使用 COM,但当然,这是一些额外的工作和要编写的新代码,如果我们拥有“这些年来工作良好”的遗留 COM 代码并且我们“只需要它在核心上”。 @quetzalcoatl 我看到了你的评论,我只是在谷歌上搜索并试图弄清楚你所说的“交换”是什么意思,我假设它是一组库? @Bojan: object 是任何东西。字符串是一个对象。如果您请求读取特定的文件格式,并且希望将其用于某些特定用途,则必须定义您期望获得的内容。通过说“并得到一个对象”,你什么都不说——我可以回答:使用System.IO.File.ReadAllText,你会得到一个字符串,它是一个对象。但是,我怀疑它真的会对您有所帮助。 @MattJohnson:哇哦,很高兴知道@Bojan:如果您想尝试mailkit,github.com/jstedfast/MailKit/blob/master/FAQ.md 和var message = MimeMessage.Load ("message.eml");Load(emlFileStream)

以上是关于将 COM 对象添加到 Asp Net Core的主要内容,如果未能解决你的问题,请参考以下文章

选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?

将 jQuery JSON 对象保存到 SQL 表中,而无需在 MVC ASP.NET Core 中创建视图模型类

ASP.NET Core MVC 数据库重定向后不添加对象

ASP.NET Core 3.1 - 将子项添加到剃刀局部视图

如何将 jQuery UI 添加到 Asp.Net Core VS2017?

将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]