или же

я есть проект модульного тестирования, который использует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.ADODB а такжеInterop.CDO.

Все, что делает этот метод, - это берет файл электронной почты и преобразует его в объект, чтобы я мог прочитать из него значения, а затем сравнить с отправленным электронным письмом. Действительно простой модульный тест для проверки содержимого электронной почты.

Есть ли способ для меня, чтобы импортировать объекты COM или есть библиотека, которая заменилаCDO.Message что я должен использовать сейчас?

 Niladri21 окт. 2017 г., 19:42
если вы используете VS2017, есть возможность добавить библиотеку COM с помощью «Добавить ссылку»
 Bojan21 окт. 2017 г., 19:43
@Niladri Я искал что-то подобное, но не вижу этого. Я использую VS2017 Community. В списке «Добавить ссылку» перечислены только проекты и общие проекты. Вот как я использую это для моих старых проектов MVC5. Сейчас это основной проект, и он кажется совсем другим.
 Niladri21 окт. 2017 г., 19:54
да плохие новости и хорошие новости для васweblogs.foxite.com/joel_leach/2016/10/19/...
 quetzalcoatl21 окт. 2017 г., 19:52
и если вам не нужен переносимый / мультиплатформенный хостинг, зачем использовать aspnetcore? сделать это на нормальном aspnet. Если я хорошо помню дорожные карты, оба будут поддерживаться в долгосрочной перспективе, поэтому ограничивать себя Core, когда вам это не нужно, кажется неразумным.
 quetzalcoatl21 окт. 2017 г., 19:50
В общем, один из пунктов фреймворков «DotNet Core» заключается в том, чтобы разрешить написание переносимых приложений, которые впоследствии можно будет также размещать в Azure / Docker / Linux / etc. Использование COM API предотвращает это, так как вам нужна Windows по определению, и часто вам также нужно установить некоторые специальные локальные компоненты, что предотвращает облачный хостинг и так далее. Если я правильно погуглил, emlFiles выглядят как электронные письма, а CDO.Message указывает на сервер Exchange? Вы уверены, что этот набор API все еще можно использовать? Я немного искал, и я думаю, что Exchange предоставляет REST API, я думаю, что это будет намного удобнее для вас в долгосрочной перспективе.

Ответы на вопрос(1)

Решение Вопроса

так как приложения .NET Core спроектированы так, чтобы быть независимыми от платформы, и COM-объекты, такие какADODB.Stream а такжеCDO.Message специфичны для Windows.

Однако это действительно возможно - если вы не возражаете против позднего связывания и слабой типизации.

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

...

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

и т.п.

Это работает в .NET Core 2.0, при работе в Windows. По всей видимости,в соответствии с этой статьей, это было невозможно в предыдущих версиях.

Тем не менее, было бы лучше переписать ваш метод с использованием управляемого независимого от платформы кода.

 Bojan21 окт. 2017 г., 20:03
@quetzalcoatl Я видел твой комментарий, я просто гуглил и пытался выяснить, что ты имеешь в виду под «Exchange». Полагаю, это набор библиотек?
 quetzalcoatl21 окт. 2017 г., 20:04
@Bojan:object НИЧЕГО. Строка - это объект. Если вы запрашиваете чтение определенного формата файла и хотите использовать его для какого-то конкретного использования, вы должны определить, что вы ожидаете получить. Говоря «и возьми предмет», ты ничего не скажешь - и я могу ответить:System.IO.File.ReadAllText и вы получите строку, которая является объектом. Однако я сомневаюсь, что это действительно поможет вам.
 quetzalcoatl21 окт. 2017 г., 20:13
@MattJohnson: ууууууууу, спасибо, это приятно знать @Bojan: если вы хотите попробовать mailkit,github.com/jstedfast/MailKit/blob/master/FAQ.md а такжеvar message = MimeMessage.Load ("message.eml"); или жеLoad(emlFileStream)
 Bojan21 окт. 2017 г., 20:01
Знаете ли вы какие-либо библиотеки, которые поддерживает Core, и он будет читать файл eml и возвращать его как объект?
 quetzalcoatl21 окт. 2017 г., 20:01
Я только что прочиталType.GetTypeFromProgID не работает на 1.0 и 1.1, либо отсутствует, либо выбрасывает платформу, не поддерживаемую - но я просто читал об этом, а не пытался сам. В любом случае, на случай, если Боян пропустит мой комментарий по этому вопросу, я твердо верю, что Exchange предоставляет новые, не COM-API, которые могут делать то же самое. Стоит проверить и прекратить использование COM, если это возможно, но, конечно, это некоторая дополнительная работа и новый код для написания, который может быть трудно реализовать с помощью управления проектами, если у нас есть устаревший код COM, который "работает хорошо все эти годы", и мы " просто нужно это на Core ".

Ваш ответ на вопрос