2010-08-05 15 views
2

我認爲這是一個工廠/供應商類型的故事,但我不知道如何描述我的問題。它是這樣的。如何使一個.NET COM包裝通用

InstallShield有一個COM自動化接口,它們在每個發行版中更改它的名稱。如果是的VBScript我會說

set project = CreateObject("ISWiAuto15.ISWiProject) ' InstallShield 2009 
set project = CreateObject("ISWiAuto16.ISWiProject) ' InstallShield 2010 

一次我有一個項目對象,我可以做的事情一樣

​​

在C#.NET 3.5添加我的COM參考,並做同樣的事情,除了現在我與這個班級緊密相連。我想能夠做到這樣的事情

var project = CreateProjectObject(typeof ISWiAutoXX.ISWiProject) 

但我不知道如何做到這一點,因爲似乎沒有任何共享接口投與。

我運氣不好還是有辦法解決這類問題?

+1

在.NET 4中,有'動態',但在3.5我相信你搞砸了。 – 2010-08-05 22:41:27

+0

我很害怕你會這麼說。我只是構建自動化框架的一小部分,我不打算很快去.NET 4。 – 2010-08-05 22:45:30

回答

4

如果您只使用.NET 3.5,最好的選擇可能是編寫您自己的接口來公開所需的確切功能,然後使用IS 2009和IS 2010來實現接口。這允許您使用任何內部實現,並創建工廠方法(或使用DI)來構造對象。

不幸的是,這確實需要相當數量的簡單傳遞(只是調用COM對象的包裝器方法)。但是,這是一種非常健壯,未來可行的操作方式,可讓您使用簡單的類型安全API。

+0

這對我的經驗水平來說可能是一個不錯的選擇。你知道任何基於COM包裝器中的類型生成接口的方法嗎?然後,我可以創建我的兩個類並實現接口,並開始連接我關心的成員。 – 2010-08-05 23:20:58

+0

@Christopher:我個人會親手寫它 - 這比自動化解決方案多一點工作,但有一些優勢。只需實現您實際將要使用的方法和屬性,並根據需要包裝它們。 (另一個好處是你可以根據你的用法命名更多的東西,這通常是很有幫助的,尤其是在使用COM時......) – 2010-08-05 23:42:03

+0

我將給你答案,因爲在編寫幾個接口和子類之後,我是進一步深入我的代碼。但是,哇,這是很多工作,因爲我打包的API的複雜性。 我不得不承認,這是一個很好的練習,但我放棄了。我爆發了一些ducktape:克隆了我的類文件,它與InstallShield進行了互操作,並進行了搜索並替換爲一個Class15和一個Class16。在父類中,我將它包裝在一個大的switch語句中,以便只有一個類被構造和調用。 – 2010-08-06 00:32:34

0

思考問題我認爲我看到一個可能的解決方案做了一個不同的方式,但它有點深奧。

引用是ItemGroup中msbuild(項目)文件的一部分。您可以通過在proj文件中包含的項目中的另一個msbuild文件中包含此特定引用來使其具體化。

最後,您可以根據查找COM接口的某些邏輯生成此外部MSBUILD文件T4,並確定該參考包含的內容。

1

如果你願意的話,你可以自定義運行時可調用包裝這樣的類型名稱不變

1

如果你樂意放棄類型安全,dynamic將是有益的,但你說這是不可您。

但是,通過使用a simple helper class to hide the noise of reflection,在老版本的語言中,您可以非常接近dynamic。它不會完成關鍵字dynamic所能做的所有事情,但它仍可能適用於您。

0

使用VB.NET創建一個強類型的包裝。然後你可以從你的C#應用​​程序調用這個包裝器。