将COM对象添加到Asp Net Core

时间:2017-10-21 17:36:17

标签: c# unit-testing asp.net-core asp.net-core-mvc email-validation

我有一个使用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的库,我现在想用它?

1 个答案:

答案 0 :(得分:9)

从.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,在以前的版本中是不可能的。

但是,使用托管平台中立代码重写您的方法会更好。