2010-09-03 74 views
0

我正在寫一個.NET類的包裝COM DLL,並公開其他.NET代碼使用的特定功能。 COM庫有幾個定義枚舉和我,像這樣使用一些枚舉類型作爲參數:公開包裝COM組件的枚舉

//C# 
public void TransactionTypeSetByEnum(COMComponent.TransactionType transType) 
{ 
    this.TransactionType = transType 
} 

'VB.NET' 
Public Sub TransactionTypeSetByEnum(_ 
    ByVal transType As COMComponent.TransactionType) 
    Me.TransactionType = transactionType 
End Sub 

然而,當我去消耗來自不同的項目這個.NET包裝,編譯器不能看到COM類型(我不想將它們暴露給消費類)。例如...

netWrappedObject.TransactionTypeSetByEnum(//...No intellisense for the enum 

是否有辦法來公開我的.NET包裝庫底層的非託管枚舉不添加非託管的DLL參考這對於恕不承擔耗費該庫中的項目?


其他背景資料:

已被編譯成一個COM組件的業務已經有工作VB6的代碼。該業務不想重寫.NET託管代碼中的這些組件,但希望能夠使用.NET應用程序中的現有代碼。我的目標不是讓每個.NET應用程序都直接拖動COM組件,而是圍繞現有的COM組件編寫.NET「包裝器」,並向其他.NET應用程序提供類和接口所需的功能。

我在使用接口設計來封裝COM DLL的思想背後的一部分是:如果企業稍後決定將現有COM DLL重寫爲100%託管的.NET代碼將會更好,我所有的要做的就是實現與新代碼的接口,並更改現有的應用程序以引用新的程序集,並可能更改一行代碼。這避免了需要重寫每個.NET應用程序的COM DLL的實現。

在我的問題上面,我的問題是,COM DLL有幾個enum s表示我要暴露通過 .NET組件是「包裝」該DLL。假設COM DLL有一個名爲ComFoo的類,它有一個枚舉調用ComFooEnum。我想NetFoo類以某種方式暴露ComFooEnum其他項目消耗NetFoo。我不希望其他項目需要參考ComFoo只是爲了能夠看到NetFoo公開的enum。如果我必須模仿ComFooEnum並製作一個新的NetFooEnum,我想這就是我要做的,但我想知道是否有更好的方法。

這裏有一個圖表,試圖解釋封裝我想實現:

______________________________ 
|       | 
| Compiled VB6 COM Assembly | 
| Exposes class called  | 
|  ComFoo     | 
|____________________________| 
         || 
_____________________ || 
|     | || 
| Existing VB6  | || 
| Business   | < | 
| Application  | || 
| references ComFoo | 
|___________________| 

//The business is building new applications in .NET 
//that need to consume ComFoo, which cannot be rewritten. 
//NetFoo exposes the functionality of ComFoo. 

____________________________________ 
|         | 
|  .NET Wrapper Assembly  | 
| Exposes class called NetFoo | 
| ______________________________ | 
| |       | | 
| | Compiled VB6 COM Assembly | | 
| | Exposes class called  | | 
| |  ComFoo     | | 
| |____________________________| | 
|__________________________________| 
         || 
_____________________ || 
|     | || 
| New .NET Business | < | 
| Order Entry App | || 
| references NetFoo | || 
|___________________| || 
         || 
_____________________ || 
|     | || 
| New .NET Business | || 
| Internet App  | < | 
| references NetFoo | || 
|___________________| 
+0

你做了什麼''?這是一個IDE問題,而不是編譯器問題。什麼IDE? – 2010-09-03 20:34:07

+0

@Hans我正在使用VS2010。我不確定我需要使用。我試圖讓包裝的COM組件類型對其他.NET項目可見,而不是COM。 會帶給我什麼? – 2010-09-03 22:34:53

+0

我不知道爲什麼你想讓一個.NET程序可見的ComVisible組件。我懷疑你已經在做COM了,也許太久了,我已經發布了許多COM問題的答案。創建一個ComVisible .NET組件並將它作爲COM組件用於.NET程序是毫無意義的。只需直接使用該組件即可,而無需跳過COM箍。根本不確定我是否在正確的軌道上,關閉你的問題標題。 – 2010-09-03 23:42:02

回答

1

沒有什麼神奇的可以在這裏找到。就像使用等效的.NET類型從COM組件中包裝接口類型一樣,所以您必須從類型庫中包裝其他聲明。如果你不想公開COM枚舉類型,那麼你必須包裝它們。使用.NET枚舉類型聲明。該代碼很簡單,通過int進行投射,但是它是一個維護項目。就像.NET類包裝器一樣。確保有包裝COM類型的實際增值,一對一映射很少有用。

除非這是最終更換COM服務器的訓練輪。這是一件好事,它給你一個很好的感覺,需要什麼。在這種情況下你真的想要聲明枚舉。

+0

+1我不明白.Net包裝的好處。對我來說,明顯的升級途徑是用具有等效簽名的.Net替換COM組件。該組件可以用於所有.Net客戶端。聽起來像這是一個重構,爲了使未來的變化更容易。但是現在要做什麼而不是在未來的變化中獲得什麼呢?我不明白這種情況下的好處。 – MarkJ 2010-09-04 19:20:00