1

我有一個使用Interop.ADODB的單元測試項目。這裏是代碼:向Asp Net Core添加COM對象

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,我想現在使用?

+0

如果你使用VS2017,那麼有一個選項可以通過「添加參考」添加一個COM庫 – Niladri

+0

@Niladri我正在尋找類似的東西,但我沒有看到它。我正在使用VS2017社區。 「添加引用」下列出的唯一項目是項目和共享項目。這就是我在我的舊MVC5項目中使用它的方式。這現在是一個核心項目,看起來非常不同。 – Bojan

+0

但我認爲它仍然存在於專業和終極不確定的社區。還有一個選項可用於彙編:「依賴關係 - >添加引用 - >彙編」 – Niladri

回答

2

從.NET Core訪問COM對象是不可取的,因爲.NET Core應用程序設計爲獨立於平臺,並且COM對象(例如ADODB.StreamCDO.Message)特定於Windows。

但是,這確實有可能 - 如果你不介意後期綁定和弱打字。

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

...

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

在Windows上運行時,該工作於.NET核心2.0。顯然,according to this article,它以前的版本是不可能的。

不過,最好使用託管平臺中立代碼重新編寫您的方法。

+0

你知道Core支持的任何庫嗎?讀取一個eml文件並將其作爲對象返回? – Bojan

+0

我剛剛讀到'Type.GetTypeFromProgID'在1.0和1.1版本上無效,無論是丟失還是拋出平臺 - 不支持 - 但我只是閱讀它,沒有嘗試過自己。無論如何,爲了防止Bojan跳過我對這個問題的評論,我堅信Exchange會公開新的,非COM API,它們可以做到這一點。如果可能的話,值得檢查和丟棄COM的使用,但是當然這是一些額外的工作和新的代碼編寫,如果我們有遺留的COM代碼,那麼「這些年來一直很好」並且我們「只需要它在覈心「。 – quetzalcoatl

+0

@quetzalcoatl我看到了您的評論,我只是在Google上搜索並試圖找出「Exchange」的含義,我認爲它是一組庫文件? – Bojan